会报错,但有例外情况;绝大多数情况下编译不通过,唯一例外是父类返回引用类型、子类返回其子类(协变返回类型),此时不报错。

会报错,但有例外情况。
绝大多数情况下编译不通过
Java 规定:方法签名 = 方法名 + 参数列表(类型、个数、顺序)。返回类型不属于方法签名的一部分,但它在重写时受严格约束。
- 如果父类方法返回基本类型(如 int、boolean)或 void,子类重写时返回类型必须完全一致;哪怕只改一个字(比如 int → long),编译器直接报错:“return type is incompatible”
- 如果父类方法返回引用类型(如 Animal),子类可返回其子类(如 Dog 或 Cat),这叫协变返回类型(Java 5 起支持),此时不会报错
- 若父类返回 Object,子类返回 String ✅;但父类返回 String,子类返回 Object ❌(扩大返回范围,不兼容)
不是重写,也不是重载——是语法冲突
当子类写了一个与父类方法名、参数列表完全相同但返回类型不同的方法,JVM 在编译期就无法区分调用意图:
- 它既不满足重写条件(返回类型不协变),也不满足重载条件(参数列表没变)
- 相当于在同一个类作用域内试图定义两个“同名同参但仅返回值不同”的方法——Java 明确禁止这种写法
- 编译器会把它当作非法重复声明,直接拒绝编译
怎么避免踩坑?
最简单可靠的方式是加 @Override 注解:
- 如果方法真能重写,加上注解后编译器会验证签名和返回类型是否合规
- 如果返回类型不合法,IDE 会立刻标红并提示错误,而不是等到运行时才发现逻辑不对
- 不加注解时,看似写了“同名同参”,实际可能只是隐藏了父类方法(尤其当返回类型不兼容时),导致多态失效
一句话总结
方法签名一致但返回类型不同,99% 的情况会导致编译失败;唯一例外是父类返回引用类型、子类返回其子类——这是 Java 允许的协变重写,不算错误。











