【问题标题】:Why this protected member is not visible in the subclass [duplicate]为什么这个受保护的成员在子类中不可见[重复]
【发布时间】:2015-11-11 14:56:58
【问题描述】:

我在理解受保护成员的继承和可见性方面存在问题。

我知道它在同一个包和子类中可见。

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

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() 是不可见的?

【问题讨论】:

  • run() 的访问修饰符是什么?

标签: java inheritance protected


【解决方案1】:

这是因为C 类可以从其自己的 继承树中看到A 的受保护方法。但不允许从不同的继承树访问 Aanother 类 (B) 的受保护方法。 C 不是B 的继承树的一部分(我的意思是它不是B 的父级),因此行为是正常的。

编辑:按要求添加文档参考

6.6.2.1. Access to a protected Member:

如果访问是通过字段访问表达式E.Id,或方法调用表达式E.Id(...),或方法引用表达式E :: Id,其中E是主表达式( §15.8),则当且仅当E 的类型为SS 的子类时才允许访问

将上述应用到这种情况下,因为变量b 不是 C 的实例或C 的子类,访问受保护的不允许使用方法b.run()

还解决了Codebender 对软件包的评论。请注意,如果 C 类与 A 类定义在同一个包中,其中定义了受保护的 run() 方法,则上述规则将不适用,您将能够访问方法如您的代码所示。

【讨论】:

  • 你能放一个官方文档链接来解释这个吗?由于 B 和 C 在同一个包中,并且在同一个包中可以访问受保护的字段,这似乎有点奇怪。
  • C 扩展 B 怎么样。这是同样的问题。
  • 从文档中添加了更多具体细节。希望能为您澄清一些事情。
猜你喜欢
  • 2018-02-11
  • 2012-02-04
  • 2014-10-09
  • 2014-11-10
  • 2012-08-08
  • 1970-01-01
  • 2011-06-22
  • 2017-06-04
相关资源
最近更新 更多