我试图弄清楚受保护的访问修饰符如何在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();
}
}
答案 0 :(得分:0)
因为即使在扩展它的类之外,也可能有A1
(A1 a1 = new A1()
)的实例。
假设您拥有:
public class B2 {
public void test() {
A1 a1 = new A1();
}
}
显然无法访问A1
的受保护字段。
答案 1 :(得分:0)
因为这是规则。仅当对象类型为A2而不是A1或B1实例时,才允许从A2访问在A1或B1中声明的受保护成员或方法。 您可以在此处找到更多信息: https://docs.oracle.com/javase/specs/