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修饰符,上述程序正常运行,结果以下:

 

每日一语:多思考多总结。

相关文章
相关标签/搜索