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是可以用来修饰内部类的。