下表爲Java訪問控制符的含義和使用狀況 java
類內部 | 本包 | 子類 | 外部包 | |
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
default | √ | √ | × | × |
private | √ | × | × | × |
經過此表一目瞭然。spa
相信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修飾符,上述程序正常運行,結果以下:
每日一語:多思考多總結。