2012-08-31 201 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出現無法訪問的:)