匿名内部类访问final修饰的方法成员变量
程序员文章站
2024-03-14 11:28:34
...
问题:匿名内部类访问方法成员变量时,该变量必须加上final,否则编译不通过
public class Main {
public void useMyInterface() {
final Integer num = 23;
MyInterface myInterface = new MyInterface() {
@Override
public void doSomething() {
System.out.println(num);
}
};
myInterface.doSomething();
}
public interface MyInterface {
void doSomething();
}
}
先说结论:通过final防止修改变量引用,保证该变量在方法体里和内部类里语义一致
再看一个现象: 如果匿名内部类访问主类的成员变量,该变量不会强制要求final,可以修改引用
反编译该类,查看匿名内部类的实现代码:
从编译结果可以看到,匿名内部类会在构造方法里会把主类的对象引用和方法成员变量引用注入进来。
因为都是指向引用,一旦某个类的某个引用发生改变,另外一个类是不知道的(匿名内部类/主类修改引用,主类/匿名内部类里仍然没发生改变)。
主类对象引用是不可能发生改变的,能发生变化的只可能是方法成员变量引用,一旦发生变化,程序是不会按照我们的思路执行
例如:
如果这个程序可以运行,那么两次打印出来的b值都会是24,并不是一个24一个25
推荐阅读
-
匿名内部类访问final修饰的方法成员变量
-
匿名内部类如何访问外部类的成员变量
-
局部内部类访问它所在方法的局部变量时,要求该局部变量必须声明为final的原因
-
匿名内部类访问外部类中的局部变量必须是final属性
-
对JAVA中内部类(匿名内部类)访问的局部变量为何要用final修饰的讨论
-
局部内部类访问它所在方法的局部变量时,要求该局部变量必须声明为final的原因
-
对JAVA中内部类(匿名内部类)访问的局部变量为何要用final修饰的讨论
-
Java匿名内部类访问的局部变量为什么必须要用final修饰
-
匿名内部类访问的局部变量为什么必须要用final修饰
-
从垃圾回收机制解析为什么局部内部类只能访问final修饰的局部变量以及为什么加final能解决问题