我试图弄清楚Java中受保护的访问修饰符是如何在包继承之间工作的。
我有两个样例包p1和p2。在p1中,有一个类A1,它有一个名为protectedMember的受保护访问实例变量,还有一个类B1,它只是简单地扩展了A1。
在p2中,我有一个扩展了A1的类A2。显然,在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();
}
}
发布于 2019-06-13 07:09:12
因为这是一条规则。你可以在这里找到更多信息:https://docs.oracle.com/javase/specs/jls/se8/jls8.pdf
发布于 2019-06-13 05:53:28
因为有可能有一个A1
(A1 a1 = new A1()
)的实例,甚至是扩展它的外部类。
假设你有:
public class B2 {
public void test() {
A1 a1 = new A1();
}
}
显然,访问A1
的受保护字段应该会失败。
https://stackoverflow.com/questions/56570047
复制相似问题