代码如下:
//定义一个类A
public class A(){}//定义一个类B,B中有个匿名内部类
public class B(){
public A getA(){
//定义一个变量X
final int X = 1;
return new A(){};
};
}请问在定义变量X的时候为什么修饰符要是final的,在匿名内部类中并没有使用到变量X,请教高手。
//定义一个类A
public class A(){}//定义一个类B,B中有个匿名内部类
public class B(){
public A getA(){
//定义一个变量X
final int X = 1;
return new A(){};
};
}请问在定义变量X的时候为什么修饰符要是final的,在匿名内部类中并没有使用到变量X,请教高手。
2.没有使用到.. 这个问题需要问你自己... 比如. 你写一个String str="Hello!";你不使用. 我们能怎么样
我的意思是说定义的int x这个变量 既然在匿名内部类中没有用到 为什么它的修饰符只能是final,例如其他的public private都是不可以的
这个例子是我自己写的 但是我的在试验的时候发现int x的修饰符只能是final的 如public private等等都是不可以的,但是我想不明白原因。
确实是不能将内部类中,属于方法的局部变量的修饰符定义为public、private或是private!
但具体为什么要这么限制,还没弄明白!
如果楼主明白了,请告知一下!
继续关注
请注意下
public A getA(){
//定义一个变量X
final int X = 1;
return new A(){};
};
在这个方法中return new A(){};这不是返回一个普通的对象,而是返回一个匿名内部类的对象.
如果一个内部类的方法访问一个在内部类外面定义的变量,那么这个变量在编译的时候就会作为一个参数传递给这个内部类,这时候你在内部类的一个方法中修改这个参数,我们亲眼看到代码中这个变量已经被改变了,但是,这个变量在内部类外部却是保持不变的,因为java的参数传递方式导致的。
所以为了保持内部类外部和内部的唯一性,java在语法上规定了内部类访问外部参数的时候,需要修饰为final。
X是不是final类型的无所谓,如果没需要 你可以不加new A(){}中要用到 那就必须是final的了
改为return new A();试一试public class B(){
public A getA(){
//定义一个变量X
final int X = 1;
return new A(){};
}; // 1
或者把上句后面的分号去掉,估计你以前学过C++