【问题标题】:Java anonymous class and reachable private variableJava匿名类和可达私有变量
【发布时间】:2011-10-31 04:33:24
【问题描述】:
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”。 我需要知道为什么它运作良好。

提前感谢您的所有帮助!

【问题讨论】:

    标签: java private inner-classes


    【解决方案1】:

    非静态内部类的每个实例都有一个封闭实例——外部类的一个实例,它通过存储在内部类对象中的引用变量与它绑定。通过该引用可用于内部类对象的封闭实例的所有成员。

    编译器当然会负责添加引用变量,以及一些特殊的访问器函数,内部类对象可以使用这些函数来获取外部类对象的私有成员。您可以通过使用javap -c 反汇编外部类来查看这些访问器函数。

    【讨论】:

      【解决方案2】:

      根据section 6.6.1 of the Java Language Specification,确定私有成员可访问性的基本规则是:

      [I]如果成员或构造函数被声明为私有,则当且仅当它出现在包含成员或构造函数声明的顶级类的主体内时才允许访问。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 静态嵌套类确实可以访问封闭类的私有静态成员。
        • 是的,没错,我的意思是“无权访问封闭类的非静态成员”
        • @SandeepRajeev:仍然不对。给定一个封闭类的实例——即,如果它接收一个作为方法参数,或者创建它自己的一个——静态嵌套类可以访问该实例的私有成员。
        • 所以我说的是它不能直接访问,但就像你说的它可以通过对象引用访问。谢谢。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-06
        • 1970-01-01
        • 1970-01-01
        • 2013-06-22
        • 1970-01-01
        相关资源
        最近更新 更多