我理解受保护的访问意味着可以访问包中的成员和任何子类,而不管包是什么。我发现难以理解的是,在子类中,当我创建具有受保护成员的类的对象时,我得到“不可见”错误? 以下代码(基于YiFan Wu的答案的扩展版本)证明了这一点。请注意,我在包内外都有相同的代码行。因此,我有两个问题:
在包中不会发生此对象访问差异,即参见A1类中的test()。
package a;
public class A{
protected int a;
}
class A1{
public void test(){
A ref = new A();
ref.a=8; // no issue
}
}
package b;
public class B extends A{
}
package c;
public class C extends B{
public void accessField(){
a = 2; //That works.
A ref = new A();
ref.a=8; // not visible!!
}
}
任何帮助都非常感谢...
谢谢, 肖恩。
答案 0 :(得分:2)
由于C
位于另一个包中,并且您正在创建A
,不是 A
的子类。
翻开问题:为什么应该可见?您已经知道打包规则,并且您已经知道了字段访问规则。
答案 1 :(得分:1)
在最后一种情况下,您正在创建一个A对象的新实例。这与使用子类的实例访问其父类的成员完全不同。
创建子类时,它首先创建父类。唯一可以访问父实例中受保护成员的子类是创建父类的子类。