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类变成蝴蝶飞走了?
final 字段就3个用途,您说的稳定性和生命周期 没听说过final能管。
你这不算外部类。你这只是通过一个类把代码分开了而已,你实例化对象是外部分开的类,相当于把外部的数据拿到了主类里面了。
懂了,只有当内部类是在一个方法内定义时,且要访问的是所在方法内的作用域的局部变量时,这个局部变量才需要是 final 的
如果访问的是外部类的成员变量,是不需要加 final 的,是可以随意访问的
但是网上却是有许多人还是这样误认为的
我之前在搜关于为什么要 final