我在Avo类中有一个实例变量,包ger1,带有受保护的修饰符。
package ger1;
public class Avo {
protected int i = 1;
}
然后我有一个类Pai,它位于ger2包中,扩展了Avo并按实例访问该变量,到目前为止很正常...
package ger2;
public class Pai extends Avo {
public Pai() {
i++
}
}
但是凯西·塞拉(Kathy Sierra)的书中提到了受保护的成员:“一旦包外的子类继承了受保护的成员,则该成员(由子类继承)对于子类外部的任何代码都是私有的,但子类的子类除外。子类。”
但是,如果我尝试通过类Pai的实例访问该成员,那是允许的!但是,Filho类必须位于Avo的同一软件包中。为什么这个?这是正常的?
package ger1;
import ger2.Pai;
public class Filho {
public Filho() {
Pai pai = new Pai();
pai.i++;
}
}
最佳答案
这是预期的行为。 “受保护”是指在子类中可见,即使它们在单独的程序包中也是如此。
编辑:另请参阅此问题
In Java, difference between default, public, protected, and private