面试知识库
基础

访问修饰符#

一句话答案#

四种访问级别由宽到窄:public(任意)> protected(同包 + 子类)> 默认/包级(同包)> private(仅本类)。封装的核心手段,遵循”最小可见性”原则。

核心要点

1. 四级可见范围

修饰符本类同包子类(不同包)任意类
private
默认(package-private)
protected
public

关键点:protected = 默认 + 不同包的子类可访问(通过继承,非通过实例)。

2. 能修饰什么

  • 类(外部类):只能 public 或 默认。内部类可用全部四种。
  • 成员(字段/方法/内部类):四种都可。
  • 局部变量:不能加任何访问修饰符。

3. 重写时的权限约束

  • 子类重写父类方法,访问权限只能放大或相等,不能缩小
  • 例如父类 public 方法,子类不能改成 protected(违反里氏替换)。

4. 设计原则

  • 最小可见性:字段优先 private,通过 getter/setter 暴露——封装基础。
  • protected 用于设计供子类扩展的钩子方法(如模板方法模式)。
面试回答(2分钟版)

Java 有四种访问修饰符,控制类、字段、方法的可见范围,由宽到窄是 public、protected、默认(也叫包级私有,不写任何关键字)、private。public 是任何地方都能访问;protected 是同一个包内可以访问,加上不同包的子类也能通过继承访问;默认级别是只有同包可见;private 是只有本类内部可见,连子类都不行。这里最容易记混的是 protected 和默认的区别:默认只限同包,protected 在同包的基础上额外开放给不同包的子类。修饰范围上也有限制:外部类只能用 public 或默认,不能用 private 和 protected;成员变量和方法四种都能用;局部变量一个都不能加。还有一个高频考点是重写时的权限规则——子类重写父类方法,访问权限只能放大或者保持不变,不能缩小,比如父类是 public 子类就不能改成 protected,否则违反里氏替换原则。设计上遵循最小可见性原则,字段尽量用 private 然后通过 getter/setter 暴露,这是封装的基础;protected 通常用来定义供子类重写的扩展钩子,比如模板方法模式。

追问与易错

追问方向:

  • “protected 和默认的区别?”→ 默认仅同包可见;protected 在同包基础上额外允许不同包的子类通过继承访问
  • “外部类能用 private 修饰吗?”→ 不能,顶层类只能 public 或默认;private/protected 只能修饰成员和内部类
  • “子类重写能缩小访问权限吗?”→ 不能,只能相等或放大,否则编译报错(违反里氏替换)
  • “接口的方法默认是什么权限?”→ public(接口方法隐式 public abstract,字段隐式 public static final)
  • “不同包的子类能访问父类的 protected 字段吗?”→ 能通过继承在子类内部访问自己继承来的,但不能通过父类实例引用去访问

易错点:

  • ❌ “protected 比 public 范围大”——顺序是 public > protected > 默认 > private
  • ❌ “默认级别子类都能访问”——不同包子类访问不到默认成员
  • ❌ “局部变量可以加 private”——局部变量不能加任何访问修饰符