private方法不能被重写,子类中同名方法是全新独立的方法,编译不报错因private对子类不可见,加@Override会报错“Method does not override method from its superclass”。

Java中private方法**不能被重写**,而且编译时**也不会报错**——因为子类里写的同名方法根本不是“重写”,而是一个**全新的、独立的方法**。它和父类的private方法之间没有任何继承或覆盖关系。
为什么编译不报错?
编译器只检查语法和作用域规则。private方法对子类不可见,子类中定义一个同名同参数的方法,在编译器看来只是“在当前类里新增一个私有方法”,完全合法。它不违反任何语法规则,所以不会报错。
- 父类的
private void print()对外(包括子类)不可见 - 子类写
private void print(),相当于自己声明了一个新方法 - 两者在字节码层面毫无关联,JVM 甚至不知道它们“撞名”了
为什么运行也不报错?
运行时更不会出问题,因为调用发生在各自的作用域内:
- 在父类内部调用
print(),只会执行父类自己的版本 - 在子类内部调用
print(),只会执行子类自己定义的版本 - 外部代码(如
main)既不能访问父类的private方法,也不能访问子类的private方法,所以根本调不到
怎么验证它不是重写?
加@Override注解试试:
立即学习“Java免费学习笔记(深入)”;
- 如果真能重写,加
@Override后编译通过 - 但实际会报错:
Method does not override method from its superclass - 这个错误明确告诉你:这不是重写,只是巧合同名
和 final/static 方法的区别
private、final、static方法都不可重写,但原因不同:
-
private:不可见 → 子类无法感知,谈不上覆盖 -
final:可见但禁止修改 → 编译器强制阻止重写 -
static:属于类而非实例 → 所谓“重写”实为隐藏(hiding),调用取决于引用类型


















