java为什么子类看不到受保护字段?
我有一门课:
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 楼答案
如果子类位于不同的包中,那么方法只能访问它们自己的受保护实例字段,而不能访问同一类的其他实例的字段。因此
this.last
和this.next
可以工作,因为它们访问this
对象的字段,但是this.last.next
和this.next.last
将不工作编辑-我不是很对。无论如何,谢谢你的支持:)
我试过一个实验。我有这门课:
而这一个在不同的包中:
所以,重要的不是
this
。我可以访问同一类的其他对象的受保护字段,但不能访问超类型对象的受保护字段,因为超类型的引用可以容纳任何对象,Car
(如Bike
)和Car
的非必需子类型无法访问由不同类型从Vehicle
继承的受保护字段(它们仅可由扩展类及其子类型访问)