大家好,我是鸭哥。
昨天鸭哥在微信群里,看到一个面试者诉苦,说自己面试时被提问权限修饰符的相关知识,要求说出 public、protected、default(无修饰符,即package private) 和 private 的区别,结果他只能根据单词的字面意思说个大概,面试官的态度迅速就冷淡了。面试前,没能把握好这类基础知识,他追悔莫及。
鸭哥想说,权限修饰符虽然是基础知识,但是怎么合理恰当地运用却是编程功底的体现,应该多思考对比不同修饰符的运用场景。我们这里的大部分读者应该是熟悉这类知识的,但是面试机会只有一次,鸭哥还是要和大家一起全面复习下~
权限修饰符的修饰对象和权限控制
- 修饰类:使用public、default(package private,无修饰符)
- 修饰变量和方法:使用public, private, protected 或 default ( package private,无修饰符)
如果一个类用 public 修饰,那么它对任何位置的所有类可见;如果一个类无修饰符,即 default ,那么它只对同一个包中的其他类可见,因此也被称为 package private.
对于类中的变量和方法,当使用 public 和 无修饰符时,访问权限与修饰类时相似。除此之外,类中的变量和方法,还可以用 private 和 protected 修饰。当使用 private 时,该变量或方法只能在本类中访问;当使用 protected 时,该变量或方法能在同一个包中被访问,或者被不同包的该类的子类访问。
不够直观?鸭哥特意整理了表格!
访问权限控制
修饰符 | 当前类 | 同一个包 | 子类(不同包) | 其他包 |
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
no modifier | √ | √ | × | × |
private | √ | × | × | × |
实例演示
如上图所示,有包 1 和包 2 ,testClassSub 是 testClass 的子类,Alpha是包1的另一个类,Beta是包2的另一个类。下表展示的是,当使用不同的修饰符修饰 testClass 的成员变量或方法时,不同包中的不同类的访问权限。
修饰符 | testClass | Alpha | testClassSub | Beta |
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
no modifier | √ | √ | × | × |
private | √ | × | × | × |
权限修饰符的设置和运用
如果其他人可能会用到你编写的类,为了少出错,我们可以尽量这样设置访问权限:
- 使用最严格的限制规则,也就是默认使用 private 修饰符。除非某个方法需要暴露给其他类使用,否则一律限制变量和方法仅本类可见;
- 尽量避免使用 public 修饰符,它将会限制你更改代码的灵活性
第二点怎么来理解呢?当你使用 public 时,修饰的内容对其他人是可见的,别人可能会使用这些公共的内容,这时候,当你需要更改时,别人也需要随之修改。最主要的是,用的人多了,你根本不知道有谁在用,你还能轻易修改 public 修饰的内容吗,代码的灵活性自然就降低了。