下表为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修饰符,上述程序正常运行,结果以下:
每日一语:多思考多总结。