【发布时间】:2018-03-24 21:01:30
【问题描述】:
假设我们有两个包p1 和p2 以及由p2.M12 扩展的类p1.M1,如下所示:
package p1;
public class M1 {
void method1() {
System.out.println("Method 1 called");
}
}
package p2;
import p1.M1;
public class M12 extends M1 {
void method2() {
System.out.println("Method 2 called");
}
}
让我们将M12 扩展为p2.B:
package p2;
public class B extends M12 {
public void doSomething() {
method1();
method2();
}
}
这会导致编译错误为method1,在p1 中受包保护在p2 中不可见。 method2 是可见的,没有问题。
现在让我们用p1.A 扩展p2.M12:
package p1;
import p2.M12;
public class A extends M12 {
public void doSomething() {
method1();
method2();
}
}
这里我遇到了method2()(这是可以理解的)和method1()的编译错误:
我的问题是:为什么包p1 中受包保护的method1 在来自同一包p1 的类A 中不可见?
【问题讨论】:
-
这意味着子类将比其父类看到更多。听起来确实有点奇怪。
-
@luk2302 包保护的方法不在包内也很奇怪。
-
这是我设法找到的 JLS 中最相关的部分:docs.oracle.com/javase/specs/jls/se9/html/…
-
假设您可以从类
A中调用method1,然后有人后来将一个名为method1的public方法添加到类M12中。在那种情况下,应该从A中调用哪个方法?如果调用了新方法,则添加新方法会改变行为。如果原来的method1仍然被调用,你将拥有一个无法从特定包调用的公共方法。 -
你可以调用
method1,只是你必须转换为M1-((M1) this).method1()的类型-这对我来说很有意义,因为method1不是公共API的一部分M12.