欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

匿名内部类访问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,可以修改引用

匿名内部类访问final修饰的方法成员变量

反编译该类,查看匿名内部类的实现代码:

匿名内部类访问final修饰的方法成员变量

从编译结果可以看到,匿名内部类会在构造方法里会把主类的对象引用方法成员变量引用注入进来。

因为都是指向引用,一旦某个类的某个引用发生改变,另外一个类是不知道的(匿名内部类/主类修改引用,主类/匿名内部类里仍然没发生改变)。

主类对象引用是不可能发生改变的,能发生变化的只可能是方法成员变量引用,一旦发生变化,程序是不会按照我们的思路执行

例如:

匿名内部类访问final修饰的方法成员变量

如果这个程序可以运行,那么两次打印出来的b值都会是24,并不是一个24一个25 

为什么不能实现方法成员变量内外部一致?