Java匿名类和可达私有变量

5
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'应该在匿名类中无法访问。 我需要知道为什么它能够正常工作。

非常感谢您提前的所有帮助!

3个回答

8
每个非静态内部类实例都有一个“封闭实例” - 一个外部类的实例通过在内部类对象中存储的引用变量与其相连接。通过该引用,内部类对象可以访问外部实例的所有成员。
当然,编译器会处理添加该引用变量的工作,并提供一些特殊访问器函数,内部类对象可以使用这些函数来访问外部类对象的私有成员。您可以使用“javap -c”反汇编外部类来查看这些访问器函数。

1
确定访问私有成员的基本规则是根据Java语言规范的6.6.1章节

如果成员或构造函数被声明为private,则只有在它们的声明所在的顶层类的主体内才允许访问。


-1
嵌套类是其封闭类的成员。非静态嵌套类(内部类)可以访问封闭类的其他成员,即使它们被声明为私有。静态嵌套类无法访问封闭类的其他成员。

1
静态嵌套类确实可以访问封闭类的私有静态成员。 - Miserable Variable
是的,没错,我的意思是“无法访问封闭类的非静态成员”。 - PaganSensei
@SandeepRajeev: 仍然不正确。如果给它一个封装类的实例 - 即,如果它作为方法参数接收一个实例,或者创建自己的一个实例 - 静态嵌套类可以访问该实例的私有成员。 - Ernest Friedman-Hill
所以我想说的是它不能直接访问,但就像你所说的那样,它可以通过对象引用进行访问。谢谢。 - PaganSensei

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接