繁体   English   中英

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

[英]Static nested sub-classes of the enclosing type can still refer to the private field members, why?

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

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变量的访问方式有所不同? 但是,如果嵌套类是非静态内部类,那么情况并非如此?

编辑:

  1. 为什么关键字super允许访问封闭类型的私有成员?
  1. 为什么静态嵌套类可以自由访问实例成员?

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM