java——訪問修飾符(private/public/protected/缺省)學習

閱讀《java核心技術 卷I》中“受保護訪問”時,讀得一知半解。書中對protected關鍵字作用一筆帶過。而protected訪問級別確實不太好理解。下面對java的4種訪問級別按照訪問性遞增順序整理如下:

一、私有(private)

  被private修飾的成員變量和方法,僅僅對本類可見,只能被本類的內部方法調用。(案例略)
  助記:我的東西中,private修飾的部分,我不跟別人分享,只有自己才能知道。

二、缺省(package-private)

  當不使用修飾符時(不要使用default關鍵字,會報錯),在技術上被稱爲“缺省訪問級別”,成員變量和方法默認是對本包可見。(案例略)
  助記:我的東西中,沒有訪問修飾符聲明的部分,默認可以和我的鄰居(住附近的那些人)分享。

三、受保護(protected)(重點)

繼承
繼承
Grandson
Son
Parent

  一個類Parent中的protected成員變量和方法可以被它的子孫類繼承,比如Son是Parent的子類,Grandson是Son的子類,那麼Grandson、Son類都繼承Parent類的protected成員變量和方法,如上圖所示。

  如果Son(Grandson同理)類在自身中創建了一個Son實例,那麼該實例總是可以通過“.”運算符訪問繼承的或自己內部定義的protected變量和方法;但是在另外一個類中,比如在Other類中用Son類創建了一個實例son,該實例通過"."運算符訪問protected變量和方法的權限規則如下:

  1. 對於子類Son中定義聲明的protected成員變量和方法,只要Other對象和Son類在同一個包中,實例son就可以訪問這些protected成員變量和方法。
  2. 對於子類Son從父類繼承而來的protected成員變量和方法,需要追溯到這些protected成員變量和方法所在的“祖先”類,比如Son的祖先是Parent類,只要Other類和Parent類在同一個包中,son實例就能訪問繼承自Parent類的protected變量和方法。

  助記:我的東西中,protected修飾的部分,不僅可以和鄰居(住附近的那些人)分享,也可以跟不在家(雖然不在同一個包)的兒子分享【但有一些的限制,見下面案例】。
案例代碼如下:
Parent類

package com.learning.protectedDemo;
/**
 * 父類(基類).
 */
public class Parent {
    protected void getName() {
        System.out.println("I'm Parent!");
    }
}

Son類

package com.learning.protectedDemo.package_one;
import com.learning.protectedDemo.Parent;
/**
 * Son類.(位置:和Parent類不同包。)
 */
public class Son extends Parent {
	// Son自身也可以定義protected訪問級別的方法
    protected void sing() {
        System.out.println("I'm son!");
    }

    public static void main(String[] args) {
        Parent parent = new Parent();
        parent.getName();       //(1) 編譯失敗。子類與父類不在同一包中時,子類中不能訪問父類實例的protected方法。只有當子類與父類同包時,子類中才能訪問父類實例的protected方法。

        Son son = new Son();
        son.sing();             //(2) 編譯通過。原因:在Son類自身中創建了一個Son類的實例,那麼該實例總是可以通過“.”運算符訪問繼承的或自己定義的protected變量和方法;
        son.getName();          //(3) 編譯通過。原因同上。
    }
}

Other類

package com.learning.protectedDemo.package_one;
import com.learning.protectedDemo.Parent;
/**
 * 其他類.(位置:和Son類同包,和Parent類不同包)
 */
public class Other {
    public static void main(String[] args) {
        Son son = new Son();
        son.sing();                 //(4) 編譯通過:由於Other類和Son類在同一個包下,所以可以聲明Son實例,通過實例中定義的protected修飾的sing方法;
        son.getName();              //(5) 編譯失敗:由於Son類中的getName方法是繼承於Parent類,Other類和Parent類不在同一個包下,無法訪問Son類繼承而來的protected方法。

        Parent parent = new Parent();
        parent.getName();           //(6) 編譯失敗:由於Other類和Parent類不在同一個包內,Other類中不可以訪問Parent類實例的protected方法;
    }
}

四、共有(public)

  被public修飾的成員變量和方法,對外部完全可見。聲明對象實例後(無論在什麼位置),實例均可通過“.”直接訪問pulic成員變量和方法。(案例略)

  助記:我的東西中,public修飾的部分,可以和任何人分享。

五、總結

修飾詞 本類 同一個包的類 繼承類 其他類
private × × ×
無(默認) × ×
protected ×
public

六、參考資源

  1. Java 中的權限修飾符(protected)
  2. java protected修飾符說明
  3. 【Java面試題】訪問修飾符public、private、protected、default(默認不寫) 區別
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章