關於protected關鍵字,即便是Java初學者也可以說出它的含義:protected修飾的成員能夠被子類訪問。可是這樣理解並不徹底準確,下面考慮它的真正含義。java
Java語言定義的訪問級別有private、package、protected、public,從前日後訪問權限依次擴大。protected和public成員可能被其餘包訪問,所以被認爲是契約的一部分。其餘三種訪問都容易理解,而protected與繼承有關,所以須要稍微注意。this
考慮以下Java程序,Zu、Fu、Zi分別定義在a、b、c三個包中,且Zu->Fu->Zi。Fu分別訪問了來自this、Fu、Zu、Zi的protected成員age。那麼下面test哪一個能經過編譯,哪一個不能?code
package a; public class Zu { protected int age = 67; }
package b; import a.Zu; import c.Zi; public class Fu extends Zu { private void test1() { System.out.println(this.age); } private void test2(Fu f) { System.out.println(f.age); } private void test3(Zu z) { System.out.println(z.age); } private void test4(Zi z) { System.out.println(z.age); } }
package c; import b.Fu; public class Zi extends Fu { }
準確的講,一個受保護的成員除了能夠被自身以及同一個包的類訪問以外,還能夠經過對象引用訪問,只要知足訪問者類型比引用類型「寬」(同一類型或者父類)。對象
根據上述規則,test一、test2訪問和被訪問者類型都是Fu,所以編譯經過。test4訪問者是Fu,被訪問者是Zi,Fu是Zi的父類,所以編譯經過。只有test3中被訪問的引用爲Zu,不是Fu的子類,所以編譯不經過,規則掌握以後就很簡單了。繼承