Java筆記: protected的真正含義

關於protected關鍵字,即便是Java初學者也可以說出它的含義:protected修飾的成員能夠被子類訪問。可是這樣理解並不徹底準確,下面考慮它的真正含義。java

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的子類,所以編譯不經過,規則掌握以後就很簡單了。繼承

相關文章
相關標籤/搜索