重写方法的访问权限必须遵循“只增不减”原则:子类修饰符只能与父类相同或更宽松,不可收窄;接口默认public方法实现时必须显式声明public;static和final方法不参与重写。

重写方法的访问权限不能随意控制,必须遵循“只增不减”原则——子类方法的访问修饰符只能与父类相同或更宽松,绝不能收窄。这是编译器强制检查的规则,不是风格建议。
父类权限决定子类可选范围
子类重写时能用什么修饰符,完全取决于父类方法的原始访问级别:
- 父类是 public → 子类必须用 public(不能改 protected、default 或 private)
- 父类是 protected → 子类可用 protected 或 public(不能降为 default 或 private)
- 父类是 默认(包私有) → 子类可用默认、protected 或 public(但跨包时默认方法不可见,无法继承)
- 父类是 private → 不参与继承,子类中同名方法只是新声明,不是重写
接口和抽象类也适用同一规则
接口中所有方法默认 public abstract,实现类重写时必须显式写 public;抽象类中的抽象方法若声明为 protected,子类实现时也可升为 public,但不能降级。哪怕没写 public,编译器也按 public 处理,所以实现类漏写 public 就会报错。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
常见错误及修复方式
遇到 "Cannot reduce the visibility" 编译错误,说明子类修饰符比父类更严格。快速解决办法:
立即学习“Java免费学习笔记(深入)”;
- 定位报错行,确认子类方法当前用了什么修饰符
- 查父类或接口中对应方法的修饰符
- 把子类方法改成等于或更宽的级别——多数情况下直接加 public 最稳妥
- 确保加上 @Override 注解,让编译器提前校验签名和权限是否匹配
static 和 final 方法不在此列
它们不参与重写:static 方法属于类,子类同名方法是隐藏(hiding);final 方法禁止覆盖。这两类方法都不该加 @Override,否则编译失败。字段也不重写,只可能被隐藏,可见性控制应通过 getter/setter 实现。

















