2012-08-31 35 views
2

我有一个类的实例变量Avo,包ger1,带有protected修饰符。访问受保护的成员

package ger1; 

public class Avo { 
    protected int i = 1; 
} 

然后,我有一个类排它是包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++; 
    } 
} 
+1

你能提供一个参考(如,一个链接或类似的东西)的书,你是什么意思?同时,为了清除访问修饰符上的问题,我推荐使用java教程http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html –

+0

这本书是“Java认证程序员6学习指南“,作者Kathy Sierra,第36页。 – Andrey

回答

0

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

编辑:又见这个问题 In Java, difference between default, public, protected, and private

+1

正确,但我想他问是否可以看到受保护的属性,或者不知道它是否属于同一个包的非子类(这也是正确的)。 – fgp

+0

即使通过实例(而不是继承),为另一个继承另一个包中的受保护成员的类? – Andrey

+0

是的,这就是为什么我与另一个问题联系在一起,它提供了一个更详细的答案。查看超过300个upvotes的答案。 – noahlz

0

您对pai.i++;呼叫在ger1封装而成。

您的受保护的int值在ger1包中声明,意思与上述相同。

因此,iprotected起可到达,所有类都驻留在同一个包中。

期望,凯西Sierra的书中写道,刚刚从ger1包移动Filhoger2包的情况。

所以,你会发现,i出现无法访问的:)