最近,又复习了一下Java的访问修饰符,总结一下吧。
Java中有三种访问修饰符,分别是public、protected和private,不带任何修饰符则称之为default。
Java的访问权限控制只存在于编译阶段,而编译生成的字节码文件事实上没有留下任何痕迹,只是在编译的时候进行访问权限的检查。其实,通过反射的手段,可以访问任何包下任何类的成员,例如,访问类的私有成员也是可能的。
一、类
类不能被protected和private修饰,一个源文件中只能有一个public类,并且该源文件名要和public类名一致,其他类只能是default。
二、成员变量和成员方法
简单而言,private具有类内可见性,default具有包内可见性,protected具有包内和子类可见性,public具有包外可见性。
假设类A有public、protected、private和default修饰的成员变量和成员方法。
- 在类A的成员方法中,可以直接访问和调用类A中用public、protected、private和default修饰的成员变量和成员方法。
- 在类A的main方法中,可以通过构造类A的对象访问和调用public、protected和default修饰的成员变量和成员方法。
- 与类A在同一个包中,未继承类A的其他类的成员方法或者main方法,与(2)一致。
- 与类A在同一个包中,继承类A的子类,子类的成员方法可以直接访问和调用父类中用public、protected和default修饰的成员变量和成员方法;子类的main方法也是和(2)一样的。
- 与类A不在同一个包中,未继承类A的其他类的成员方法或者main方法只能通过构造类A的对象访问public修饰的成员变量和成员方法。
- 与类A不在同一个包中,继承类A的子类,它的成员方法可以直接访问和调用父类中用public和protected修饰的成员变量和成员方法;子类的main方法同(5)。
三、关于private的一些事
private修饰final方法没有意义,因为final方法本身就不允许子类覆盖它,然而加上private后,这个方法对于子类而言不具有可见性,谈何覆盖。
private修饰abstract方法是错误的,abstract方法要求子类实现它,然而加上private后,这个方法对于子类而言不具有可见性,谈何实现(覆盖)。
转载请注明如下内容:
文章来自简书,作者:就是杨宗
原文链接:http://www.jianshu.com/p/e81452a19228
网友评论