为什么受保护的字段对子类不可见?

时间:2015-06-19 13:11:04

标签: java class

我有一个班级:

package foo;
public abstract class AbstractClause<T>{
    protected T item;
    protected AbstractClause<T> next;
}

及其子类(在不同的包中):

package bar;
import foo.AbstractClause;

public class ConcreteClause extends AbstractClause<String>{

    public void someMethod(ConcreteClause c) {
        System.out.println(this.next);      // works fine
        System.out.println(c.next);         // also works fine
        System.out.println(this.next.next); // Error: next is not visible
    }
}

为什么?

1 个答案:

答案 0 :(得分:3)

似乎如果子类位于不同的包中,则方法只能访问自己的受保护实例字段,而不能访问同一类的其他实例字段。因此,this.lastthis.next有效,因为他们访问this对象的字段,但this.last.nextthis.next.last将不起作用。

public void append(RestrictionClauseItem item) {
    AbstractClause<Concrete> c = this.last.next; //Error: next is not visible
    AbstractClause<Concrete> d = this.next; //next is visible!
    //Some other staff
}
编辑 - 我不太对劲。无论如何,谢谢你的支持:)

我尝试了一个实验。我有这门课:

public class Vehicle {
    protected int numberOfWheels;
}

这个在不同的包中

public class Car extends Vehicle {

  public void method(Car otherCar, Vehicle otherVehicle) {
    System.out.println(this.numberOfWheels);
    System.out.println(otherCar.numberOfWheels);
    System.out.println(otherVehicle.numberOfWheels); //error here!
  }
}

所以,this这不是重要的事情。我可以访问同一类的其他对象的受保护字段,但不能访问超类型对象的受保护字段,因为超类型的引用可以包含任何对象,而不是Car的必要子类型(如Bike)和Car无法访问Vehicle中不同类型继承的受保护字段(只能扩展类及其子类型)。