代码之家  ›  专栏  ›  技术社区  ›  Abu Muhammad

为什么此受保护的成员在子类[重复]中不可见

  •  5
  • Abu Muhammad  · 技术社区  · 9 年前

    我在理解受保护成员的继承和可见性时遇到了问题。

    我知道它在相同的包和子类中是可见的。

    但在下面的代码中,它在子类中不可见。

    A、 java语言

    package a;
    
    public class A {
    
        public static void main(String[] args) {
    
        }
    
        protected void run() {
    
        }
    }
    

    B、 java语言

    package b;
    
    import a.A;
    
    public class B extends A {
        public static void main(String[] args) {
            B b = new B();
            b.run(); // this works fine
        }
    }
    

    C、 java语言

    package b;
    import a.A;
    
    public class C extends A{ // it will not work also if extends B
        public static void main(String[] args) {
            B b = new B();
            b.run(); // this is the problem; not visible
        }
    }
    

    为什么最后一个类中的b.run()是不可见的?

    1 回复  |  直到 9 年前
        1
  •  7
  •   sstan    9 年前

    这是因为课堂 C 可以看到 A 的受保护方法 拥有 继承树。但不允许访问 A. 的受保护方法 另一个 类( B )来自不同的继承树。 C 不是的一部分 B 的继承树(我的意思是,它不是 B ),因此行为正常。

    编辑:根据要求添加文档参考

    6.6.2.1. Access to a protected Member :

    如果通过字段访问表达式进行访问 E.Id ,或 方法调用表达式 E.Id(...) ,或方法引用表达式 E :: Id 哪里 E 是主表达式( §15.8 ),那么 当且仅当 E S 或其子类 S .

    将上述应用于本例,因为变量 b 的实例 C 或其子类 C ,访问受保护的方法 b.run() 不允许。

    同时寻址 Codebender 的评论。注意,如果 C 类将与 A. 类,其中受保护的 run() 方法,则上述规则将不适用,您将能够访问代码中所示的方法。