中 基础
访问修饰符#
一句话答案#
四种访问级别由宽到窄:
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”——局部变量不能加任何访问修饰符