访问受保护成员
在类Avo中,我有一个实例变量,包ger1,带有protected修饰符。
package ger1;
public class Avo {
protected int i = 1;
}
然后我有一个Pai包,它在Ger2包中,扩展了Avo并通过实例访问变量,到目前为止正常...
package ger2;
public class Pai extends Avo {
public Pai() {
i++
}
}
但是Kathy Sierra的书中提到受保护的成员,“一旦子类继承了受保护的成员,那么该成员(由子类继承)对于子类之外的任何代码都是私有的,除了子类的子类之外子类“。
但是,如果我尝试通过类派的实例访问成员它是允许的! 但是,Filho类必须与Avo相同。 为什么这个? 这是正常的?
package ger1;
import ger2.Pai;
public class Filho {
public Filho() {
Pai pai = new Pai();
pai.i++;
}
}
这是预期的行为。 “保护”意味着在子类中可见,即使它们在单独的包中。
编辑:另请参阅此问题在Java中,默认,公共,受保护和私有之间的区别
你打电话给pai.i++;
是在ger1
软件包中制作的。
您的protected int值在ger1
包中声明,意思与上面相同。
所以, i
可以访问,因为protected
值可以被所有在同一个包中的类访问。
为了期待Kathy Sierra的书写的情况, 只需将Filho
类从ger1
包移动到ger2
包。
所以你会注意到i
出现无法访问:)