大家都知道,Java中的访问权限修饰符从小到大分为四种:private
、缺省、protected
和 public
修饰符 | 本类 | 本包 | 本包和所有子类 | 外部包 |
---|---|---|---|---|
private | √ | |||
缺省(包访问权限) | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
但是可能很多人没有真正完全的搞懂这四种访问权限修饰符在不同地方的使用限制,本文将从外部类、内部类、接口、类中的方法、接口中的方法、类中的字段和接口中的字段这 7 个角度分别解释
外部类:外部类只能使用
private
或缺省这两种访问权限修饰符,且同一个.java
文件中只允许存在一个public
的类。内部类:内部类的访问权限比较特殊,要分成几类来看
- 成员内部类:成员内部类的访问权限与其所在的外部类的访问权限没有关系。成员内部类可以使用
private
、缺省、protected
和public
这四种访问权限修饰符。 - 局部内部类:声明局部内部类不能有权限修饰符,局部内部类的作用域被限定在声明这个局部类的块中
- 匿名内部类:没有权限修饰符
- 成员内部类:成员内部类的访问权限与其所在的外部类的访问权限没有关系。成员内部类可以使用
接口:接口只能使用
public
访问权限修饰符普通类中的方法:类中的方法可以使用
private
、缺省、protected
和public
这四种访问权限修饰符。抽象类中的普通方法可以使用的权限修饰符和跟普通类中的方法一样,抽象类中的抽象方法,可以使用缺省、
protected
和public
这三种访问权限修饰符,抽象方法不可使用private
修饰接口中的方法:接口中的方法只能使用
public
访问权限修饰符,即使不写访问权限修饰符,默认也是public
。顺便一提,接口中default
修饰的方法,它是 Java 8 新增的特性,使得接口中可以有默认实现的方法,这样实现类就不必强制实现这些方法了,主要帮助接口演化。使用default
修饰符的方法是public
的。值得注意的是,在 Java 9 中,接口方法被允许可以是private
的,但是私有方法只能在接口本身访问,作用有限。类中的字段:类中的字段可以使用
private
、缺省、protected
和public
这四种访问权限修饰符。接口中的字段:接口中的字段只能使用
public static final
(可以省略)修饰,即使字段不写修饰符,默认也是public static final
的,接口中的所有字段都是公共静态常量。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。