为什么java内部类成功访问到了外部类中的非 final 成员?

package priv.stedeshain.innerclass;

class Obj {
    int i;
    public Obj(int i) {
        this.i = i;
    }
    public String getValue() {
        return Integer.toString(i);
    }
}

interface U {
    void a();
}

class A {
    Obj var;

    public A(Obj a) {
        this.var = a;
    }

    public U getU() {
        return new U() {

            @Override
            public void a() {
                System.out.println("A(" + this + ") var=" + var.getValue() + "(" + var + ") is calling method a()");
                System.out.println();
            }
        };
    }
}

public class Practice23 {
    public static void main(String[] args) {
        A a = new A(new Obj(1));

        U u = a.getU();
        u.a();

        a.var = new Obj(199999);
        System.out.println("a.var = new Obj(199999)");

        U u2 = a.getU();
        u2.a();
        u.a();
    }
}

代码里,内部类成功访问到了外部类的非 final 成员(是实质上的非 final 成员,在后面的代码里甚至还修改了该成员指向的对象)

但是这种行为不是不被允许的吗?

这是执行结果:

 望有人为我解惑

没有访问到外部啊。

这分明是你用构造函数 构造进来的对象。

外部指的是没有联系的外部。

A类里有B对象,然后你把B对象,初始化了,用A类中的B对象 调用了A类成员对象的方法。

就说,B类调用了外部类的方法?。

A类呢?A类变成蝴蝶飞走了?

img final 字段就3个用途,您说的稳定性和生命周期 没听说过final能管。

你这不算外部类。你这只是通过一个类把代码分开了而已,你实例化对象是外部分开的类,相当于把外部的数据拿到了主类里面了。

懂了,只有当内部类是在一个方法内定义时,且要访问的是所在方法内的作用域的局部变量时,这个局部变量才需要是 final 的

如果访问的是外部类的成员变量,是不需要加 final 的,是可以随意访问的

但是网上却是有许多人还是这样误认为的

我之前在搜关于为什么要 final