2

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

2 回答 2

0

您的电话pai.i++;是在ger1包裹中进行的。

您的 protected int 值在ger1包中声明,含义同上。

因此,i是可访问的,因为protected位于同一包中的所有类都可以访问值。

要期待 Kathy Sierra 的书所写的案例,只需将Filho类从ger1一个包移到ger2另一个包。

这样您就会注意到i似乎无法访问:)

于 2012-09-28T12:44:01.680 回答
0

这是预期的行为。“受保护”意味着在子类中可见,即使它们位于单独的包中。

编辑:另请参阅这个问题 在 Java 中,默认、公共、受保护和私有之间的区别

于 2012-08-31T00:37:50.483 回答