天天看点

Java修饰符private,default,protected,public 区别的再辨识

Java访问控制符的含义和使用情况:

 类内部  本包  子类 外部包 
public    √  √  √  √
protected   √  √  √  ×
default(默认)    √  √  ×  ×
private   √  ×  ×  ×

相信大家在学习java基础时都会碰见这个修饰符作用范围表,但其实这个表格里面的表述是有些含糊的,尤其是关于子类的部分。

经过本人的过滤分析,理解思路如下:

1、从private开始由小到大分为四个范围程度,存取权限逐渐递增;

2、private修饰的成员变量及方法只能在本类中使用,可直接调用;

3、到default层次存取权限开放,使得同一包内的类(包括其本包内子类)便可访问此成员变量或方法;

4、目前为止,两个层次的范围为此类内及本包内,protected和public进一步开放外包访问权限;

5、其中protected开放处于外部包的子类对其的存取权限,而public则进一步开放所有外部包类对其的存取权限。

总结性表述:类内(private), 本包(default),外包(protected<仅仅开放外包子类>  ,public)

注意点:Java的访问控制是停留在编译层的,也就是它不会在.class文件中留下任何的痕迹,只在编译的时候进行访问控制的检查。其实,通过反射的手段,是可以访问任何包下任何类中的成员,例如,访问类的私有成员也是可能的。

补充点:关于类的修饰符只有default(默认)和 public,为什么没有private和protected?

理由很简单, private 修饰的东西是基于类内存取,放置于一个包内的类自然就没法变为私有的,因为它自身存在就是要被其他类来获取。但有一种例外情况,如果是在一个类中放置的类(内部类)就可以使用private修饰符,关于内部类可以视为一个特殊的成员变量。

此外,protected可以用类似的逻辑思路来思考, protected是开放外部包的子类对其的存取权限,那前提条件就是此类被某子类获取继承,但一个被修饰为protected的类是不可能被某子类所获取继承的,这样的思路就有点“递归”的味道了,其前提思路是永远没办法达到的。同样的,protected是可以用来修饰内部类的。

继续阅读