Java 权限修饰符


1 作用

主要用于控制类, 属性, 方法的访问

2 种类

  1. public
  2. protected
  3. 什么都不加(默认, 有的地方写作 default)
  4. private

3 修饰的地方

属性 方法 外部类 内部类
public Y Y Y Y
protected Y Y N Y
什么都不加 Y Y Y Y
private Y Y N Y

从中可知: 4 个修饰符都能修饰: 属性, 方法, 内部类。
但是修饰外部类的只有 public什么都不加

4 可被访问的范围

类的内部调用 子类内部调用 调用类 (和父类同包) 直接调用 调用类 (和父类不同包) 直接调用 调用类通过其子类间接调用 (和父类同包) 调用类通过其子类间接调用 (和父类不同包)
public Y Y Y Y Y Y
protected Y Y Y N Y N
什么都不加 Y Y/N(特殊说明) Y N Y/N(特殊说明) N
private Y N N N N N

上面的几种情况说明一下:

  1. 类的内部调用: 类内部的方法互相调用
  2. 子类内部调用: 子类调用父类的方法
  3. 调用类直接调用: 类 A 调用 类 B 的方法
  4. 调用类通过其子类间接调用: 类 A 是父类, 有方法 fn, 类 B 是 类 A 的子类, 类 C 调用 类 B 的 fn 方法

什么都不加(默认)

  1. 子类内部调用: 当子类和父类不在同一个包下, 无法调用, 但是在同一个包下, 能调用
  2. 调用类通过其子类间接调用(和父类同包): 调用类, 子类, 父类, 都在同一个包路径下, 能够执行成功, 其他的情况, 都会失败

5 总结

public 强调的是共有的, 所以在所有的地方都能调用

protected 强调的是同一个包和子类, 所以可以在

  1. 类内部调用
  2. 子类内部调用
  3. 同一包下, 调用类调用, 即使是隔着子类间接的调用都可以, 只要 调用类和父类维持在统一包路径下

什么都不加 (default) 强调的是同一个包, 所以可以在

  1. 类内部调用
  2. 子类和父类在同一个包下, 子类能调用
  3. 子类, 父类, 调用类都在同一个包下, 调用类可以通过子类间接调用到

private 强调的是私有的, 所以只能在类的内部调用

6 补充

  1. 我们声明接口时, 接口方法 没有修饰符, 默认是 public
  2. 4个修饰符的控制访问 private < 什么都不加 < protected < public, 在重写父类的方法的时候, 修饰符必须大于父类的修饰符

  目录