昨天鸭哥在微信群里,看到一个面试者诉苦,说自己面试时被提问权限修饰符的相关知识,要求说出 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×××

实例演示

0001.png

如上图所示,有包 1 和包 2 ,testClassSub 是 testClass 的子类,Alpha是包1的另一个类,Beta是包2的另一个类。下表展示的是,当使用不同的修饰符修饰 testClass 的成员变量或方法时,不同包中的不同类的访问权限。

修饰符testClassAlphatestClassSubBeta
public
protected×
no modifier××
private×××

权限修饰符的设置和运用

如果其他人可能会用到你编写的类,为了少出错,我们可以尽量这样设置访问权限:

  • 使用最严格的限制规则,也就是默认使用 private 修饰符。除非某个方法需要暴露给其他类使用,否则一律限制变量和方法仅本类可见;
  • 尽量避免使用 public 修饰符,它将会限制你更改代码的灵活性

第二点怎么来理解呢?当你使用 public 时,修饰的内容对其他人是可见的,别人可能会使用这些公共的内容,这时候,当你需要更改时,别人也需要随之修改。最主要的是,用的人多了,你根本不知道有谁在用,你还能轻易修改 public 修饰的内容吗,代码的灵活性自然就降低了。

关于权限修饰符的使用,你有哪些心得体会呢?

标签: java, Java面试题, stackoverflow中文版, Java public, Java protected, Java private