//Filename: A.java
package packageA;
public class A {
protected int x;
}
//Filename B.java
package packageB;
import packageA.A;
public class B extends A {
void action(A ob1, B ob2, C ob3) {
x = 10;
ob1.x = 10; // <-- error here
ob2.x = 10;
ob3.x = 10;
}
public class C extends B {
void action(A ob1, B ob2, C ob3) {
x = 10;
ob1.x = 10; // <-- error here
ob2.x = 10; // <-- error here
ob3.x = 10;
}
所以,我正在阅读Java中的受保护用法并遇到了这个问题。
如您所见,A.java
和B.java
是单独的文件,并保存在单独的包中。在编译B.java
时,我得到x
在A
中保护访问权限的3个错误。有人可以解释为什么即使在扩展课程A
之后我也会收到错误吗?
答案 0 :(得分:1)
您不允许通过超类型引用访问受保护的成员。请参阅Java Language Specification, section 6.6.2: Details on Protected Access。
这里的方法增量发生编译时错误:它无法访问 受保护的成员x和y的参数为p,因为当Point3d( 对字段x和y的引用出现的类)是的子类 Point(声明x和y的类),它不参与 Point的实现(参数p的类型)。方法 delta3d可以访问其参数q的受保护成员,因为 class Point3d是Point的子类,参与实现 一个Point3d。
答案 1 :(得分:0)
在类action
的方法B
中,您将获得类A
- ob1
的实例作为参数。
ob1
本身是一个纯类A
对象。它不是从B
类扩展的类A
的实例。因此,您无法覆盖A类之外的A类受保护成员。
您可以覆盖B类的字段成员x
,因为{A}已从A类受保护的成员x
扩展。
x