interface Test {
public void test();
}
public class TestMain {
private String h = "AAA";
public static void main(String[] args) {
TestMain t = new TestMain();
}
public TestMain() {
Test t = new Test() {
public void test() {
System.out.println( h );
}
};
t.test();
}
}
上述来源效果很好。
但我认为变量'h'应该无法从匿名类中访问。 我需要知道它为什么运作良好。
提前感谢您的所有帮助!
答案 0 :(得分:7)
非静态内部类的每个实例都有一个封闭实例 - 外部类的一个实例,它通过存储在内部类对象中的引用变量绑定到它。通过该引用可用于内部类对象的封闭实例的所有成员。
编译器负责添加该引用变量,当然还有一些特殊的访问器函数,内部类对象可以使用这些函数来获取外部类对象的私有成员。您可以通过使用javap -c
反汇编外部类来查看这些访问器函数。
答案 1 :(得分:1)
根据section 6.6.1 of the Java Language Specification:确定私人成员可访问性的基本规则:
[I]如果成员或构造函数被声明为private,那么当且仅当它发生在包含成员或构造函数声明的顶级类的主体内时才允许访问。
答案 2 :(得分:-1)
嵌套类是其封闭类的成员。非静态嵌套类(内部类)可以访问封闭类的其他成员,即使它们被声明为私有。静态嵌套类无权访问封闭类的其他成员。