封闭类型的静态嵌套子类仍然可以引用私有字段成员,为什么?

时间:2016-11-17 11:13:20

标签: java inheritance inner-classes

我找到了一些含糊不清的恕我直言。假设我们有以下类结构:

public class A
{
    private int privateVar = 1;
    protected int protectedVar = 2;

    static class B extends A
    {
        public int getPrivateVariable()
        {
            return privateVar; //error: Cannot make a static reference to the non-static field memberVariable
        }

        public int getProtectedVariable()
        {
            return protectedVar; //OK: Why?
        }

        public int getPrivateUnfair()
        {
            return super.privateVar; //Why this can be accessed using super which the protected member doesn't require.
        }
    }
}
  1. 为什么静态嵌套类可以自由访问实例成员?
  2. 为什么protectedprivate变量的访问方式有所不同?但是,如果嵌套类是非静态内部类,那么情况并非如此?
  3. 编辑:

    1. 为什么关键字super允许访问封闭类型的私有成员?

2 个答案:

答案 0 :(得分:4)

  
      
  1. 为什么静态嵌套类可以自由访问实例成员?
  2.   

因为B extends A。您未访问A的成员变量,您正在访问B的继承成员变量。

  
      
  1. 为什么保护和私有变量的访问方式有所不同?但是,如果嵌套类是非静态内部类,那么情况并非如此?
  2.   

因为私有字段不是继承的,而受保护的字段是;但私有字段仍然存在于超类中,并且可以通过super显示,因为B嵌套在A中。可见性修饰符不足以表达与通过超级访问相同的内容。

答案 1 :(得分:3)

  

为什么静态嵌套类可以自由访问实例成员?

嵌套类可以访问同一外部类中的所有私有成员。它们都是一次编译的,并且添加了访问器方法以允许这样做。注意:hte JVM不允许这样的访问,这就是需要添加访问器方法的原因。

  

为什么保护和私有变量的访问方式有所不同?

假设受保护的成员通过超类访问,因为它们是继承的。私有字段不是继承的,但可以访问嵌套类。