2011-10-31 30 views
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(); 
} 

} 

上面的源代码运行良好。Java匿名类和可访问私有变量

但我认为变量'h'应该从匿名类无法访问。 我需要知道它为什么运作良好。

感谢您提前给予您的所有帮助!

回答

7

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

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

-1

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

+1

静态嵌套类可以访问封闭类的私有静态成员。 –

+0

这是正确的,我的意思是“不能访问封闭类的非静态成员” – PaganSensei

+0

@SandeepRajeev:仍然不正确。给定一个封闭类的实例 - 也就是说,如果它接收一个作为方法参数,或者创建它自己的一个 - 静态嵌套类可以访问该实例的私有成员。 –

1

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

[I] F中的部件或构造函数被声明为专用,则访问被许可,当且仅当它发生在身体内包含成员或构造函数声明的顶级类。