Java--default詳解

下表爲Java訪問控制符的含義和使用狀況 java

   類內部  本包  子類 外部包 
public   √  √  √  √
protected  √  √  √  ×
default   √  √  ×  ×
 private  √  ×  ×  ×

經過此表一目瞭然。spa

  • public:Java語言中訪問限制最寬的修飾符,通常稱之爲「公共的」。被其修飾的類、屬性以及方法不只能夠跨類訪問,並且容許跨包(package)訪問。
  • private:Java語言中對訪問權限限制的最窄的修飾符,通常稱之爲「私有的」。被其修飾的類、屬性以及方法只能被該類的對象訪問,其子類不能訪問,更不能容許跨包訪問。
  • protected:介於public 和 private 之間的一種訪問修飾符,通常稱之爲「保護形」。被其修飾的類、屬性以及方法只能被類自己的方法及子類訪問,即便子類在不一樣的包中也能夠訪問。
  • default:即不加任何訪問修飾符,一般稱爲「默認訪問模式「。該模式下,只容許在同一個包中進行訪問。

相信public、protected、private你們都特別清楚,如今主要經過反射機制來驗證下default。對象

先定義一個抽象類FourModifier,以下:繼承

package com.common.fourmodifier;
//沒有訪問控制符修飾,
abstract class FourModifier {
    private int age;
    //default
    String name;
}ci

而後定義一個SubFourModifier類繼承FourModifier,並位於同一個package下,以下get

package com.common.fourmodifier;編譯

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
//與父類在同一個package下
public class SubFourModifier extends FourModifier{
    public static void main(String[] args) {
        System.out.println("類修飾符:"+Modifier.toString(FourModifier.class.getModifiers()));
        //反射獲取全部聲明成員變量(包括私有)
        Field[] field = FourModifier.class.getDeclaredFields();
        for(Field f:field){
            if("".equals(Modifier.toString(f.getModifiers()))){
                System.out.println("field:default "+f.getName()); //缺省狀況下默認爲default,因此獲取修飾符爲""
            }else{
                System.out.println("field:"+Modifier.toString(f.getModifiers())+" "+f.getName());
            }
        }
    }
}table

運行結果以下:class

或許如今你會以爲能夠在子類訪問分類的default成員變量,錯!import

那麼如今試試新建一個package,並在此package下新建一個類繼承FourModifier,以下:

因爲粘代碼不能顯示錯誤,直接上圖,你會發現直接編譯報錯,由於FourModifier類沒有聲明訪問控制類型,默認爲default,而default只能在同一個package下訪問類成員變量,不管是否是子類。

若FourModifier類加上public修飾符,上述程序正常運行,結果以下:

 

每日一語:多思考多總結。

相關文章
相關標籤/搜索