问题描述
- java方法参数的修饰符问题
-
java在写方法时,为什么有的方法参数用final修饰?
还有就是内部类存在的意义是什么?
也就是说方法中的内部类和类中的内部类各有什么应用场景(请有实战经验的大神各自举个例子)?//问题补充(关于方法中的内部类)
我的意思是:
pubic class TestClass{public void fun(){ public class Test1{ //........ } } }
解决方案
为了实现一些内容,常常需要这么玩:
public void test() {
Comparable c = new Comparable(){
@Override
public int compareTo(Object o) {
return 0;
}
};
}
你所看到的是实现了一个接口(用Comparable为例)的匿名类,现在,提出了一个需求:方法中有一个局部变量a,这个匿名类需要实现将别的值和这个方法中的局部变量值作比较。
这样的方法使用存在着固有问题:
public void test() {
String str = new String("进行比较");
Comparable<String> c = new Comparable<String>(){
public Object comparing;
@Override
public int compareTo(String o) {
return str.compareTo(o);
}
};
str = new String("值改变了");
c.compareTo("进行比较");
}
//警告:这是一段错误的代码
这其中的逻辑漏洞在于:方法中的局部变量已经改变了指向,调用方法时的那个str是该指向"进行比较"还是"值改变了"呢?
c语言的指针用法可以很明确的传达这些信息,但Java抛弃了指针,这个问题就必须用另一种方式进行明确。
final 修饰符的含义是,这个变量所指向的信息是不可修改的。也就是说
final String str = new String("进行比较");
str = new String("值改变了");
//警告:这是一段错误的代码
这两条语句本身就是矛盾的,编译器会直接阻止这种赋值语法。
这样,匿名内部类的方法中取用的变量就一定是定义时的那个值,也就不再害怕因为变量改变指向导致语法逻辑不清晰。
同样的,final修饰符也可以挂在参数上,意义和局部变量是一样的。
简单地说,final修饰符是为了在匿名对象的方法中使用此变量
解决方案二:
方法中那个不是内部类,而是匿名实现接口,场景就是编写一个实现接口的类,但是这个类只使用一次。java不像C++支持函数指针,要传一个函数,只能传一个实现了函数的接口,所以为了简化代码,才有了匿名接口实现。
内部类的好处,内部类可以自由访问所在类的成员,使得内部类像友元类。同样,java不支持友元,所以用内部类变相实现了这一点。同时,内部类使得类的组织更有条理。
解决方案三:
final修饰的类,不允许继承/派生。string就是final类。修饰为final类可以杜绝派生类重写方法篡改某些逻辑的可能。比如随机数生成器之类比较敏感的类。同时final可以提高性能,比如string
解决方案四:
final修饰变量,这个变量除了初始化以外不允许再次赋值。相当于只读变量
详细参考:http://wenjiesu.iteye.com/blog/799332
解决方案五:
有的方法参数用final修饰是为了让子类不能重写,子类无法覆盖
解决方案六:
有的方法参数用final修饰是为了让子类不能重写,子类无法覆盖
解决方案七:
java在写方法时,为什么有的方法参数用final修饰?
这个问题是因为下面是一个匿名的内部类需要用到这个参数所有要加final去修饰