java权限修饰符使用不当会直接触发编译错误:外部类不可用private/protected修饰;跨包通过父类引用调用protected成员非法;default成员跨包不可见;子类重写方法不可收紧访问权限。

Java 权限修饰符使用不当会直接触发编译器拒绝生成字节码,因为访问控制是编译期强制执行的语义规则,不是运行时检查。一旦违反可见性契约,javac 就会报错并中断编译。
外部类误用 private 或 protected
顶层类(非内部类)不能用 private 或 protected 修饰,这是语法硬性限制。
- private class MyClass { } → 编译错误:”modifier private not allowed here”
- protected class MyClass { } → 编译错误:”modifier protected not allowed here”
- 原因:外部类需被其他类加载或实例化,private 完全封闭、protected 的继承语义在类层级无意义,仅 public 或 默认(包级) 合法
跨包调用 protected 成员失败
protected 不等于“子类 anywhere 都能调”,它只保证继承链上的可访问性,不支持通过父类引用跨包调用。
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 父类 com.a.Parent 中有 protected void doTask() { }
- 子类 com.b.Child extends Parent 在不同包中
- new Parent().doTask() → 编译错误:”has protected access in Parent”
- new Child().doTask() → 正确(继承后子类自身可调用)
default 权限下跨包访问失败
没写修饰符即默认包级私有,该成员对包外所有类(含子类、同名类、测试类)完全不可见。
- 类 com.utils.Helper 中方法 void parse() { }(无修饰符)
- 另一个包 com.app.Main 中调用 new Helper().parse() → 编译错误:”cannot find symbol”
- 即使 Main 和 Helper 类名相同、逻辑相关,只要不在同一包,就无法访问
子类重写时擅自收紧访问权限
重写方法的访问权限不能比父类更严格,否则破坏里氏替换原则,编译器会拦截。
- 父类方法:protected void init() { }
- 子类重写为:void init() { }(默认)或 private void init() { }
- → 编译错误:”attempting to assign weaker access privileges”
- 合法操作只有:保持 protected 或升级为 public
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










