访问受保护的成员

时间:2012-08-31 00:28:12

标签: java protected

我在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++;  
    }  
} 

2 个答案:

答案 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似乎无法访问:)