我在Avo类中有一个实例变量,包ger1,带有protected modifier。
package ger1;
public class Avo {
protected int i = 1;
}
然后我有一个包含ger2的类Pai,扩展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++;
}
}
答案 0 :(得分:0)
这是预期的行为。 “protected”表示在子类中可见,即使它们位于单独的包中。
编辑:另请参阅此问题 In Java, difference between default, public, protected, and private
答案 1 :(得分:0)
您对pai.i++;
的来电是在ger1
包中进行的。
您的protected int值在ger1
包中声明,与上面的含义相同。
因此,i
是可以访问的,因为驻留在同一个包中的所有类都可以访问protected
值。
为了期待Kathy Sierra的书写的情况,只需将Filho
课程从ger1
包裹移至ger2
包裹。
因此您会注意到i
似乎无法访问:)