我有一个班级:
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
}
}
为什么?
答案 0 :(得分:3)
似乎如果子类位于不同的包中,则方法只能访问自己的受保护实例字段,而不能访问同一类的其他实例字段。因此,this.last
和this.next
有效,因为他们访问this
对象的字段,但this.last.next
和this.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
中不同类型继承的受保护字段(只能扩展类及其子类型)。