【发布时间】:2019-10-27 10:20:48
【问题描述】:
我试图弄清楚受保护的访问修饰符如何在 Java 中的包继承之间起作用。
我有 2 个示例包 p1 和 p2。在 p1 中有一个类 A1 具有一个名为 protectedMember 的受保护访问实例变量,另一个类 B1 只是扩展了 A1。
在 p2 中,我有一个类 A2,它也扩展了 A1。 显然,在 A2 中,我将可以直接访问其父级(A1 类)的受保护成员,这很好,而且不在我的问题之内。
但是,如果我在 A2 中创建一个启动 A1 或其子 B1 的实例的方法 - 那么我无法访问此实例的受保护成员。为什么 ?与默认不同的受保护成员可被扩展类的包和外部包类访问。
那么为什么在“多包”继承中我可以直接到达父级的受保护成员,但不能通过实例。
请不要回答“你必须在父母的包裹里做”——我明白我必须这样做。
我想知道为什么?
package p2;
import p1.A1;
import p1.B1;
public class A2 extends A1 {
// please note - multi package inheritance
public void test (){
/*
with non of the instances below I can reach the protected member in A1
*/
A1 a1 = new A1();
B1 b1 = new B1();
}
}
【问题讨论】:
-
详细解释in the JLS。不确定我能否回答为什么受保护的访问是这样设计的。
标签: java inheritance protected