访问受保护成员时出错

时间:2015-10-09 14:44:16

标签: java oop inheritance packages protected

//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.javaB.java是单独的文件,并保存在单独的包中。在编译B.java时,我得到xA中保护访问权限的3个错误。有人可以解释为什么即使在扩展课程A之后我也会收到错误吗?

2 个答案:

答案 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