You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中RuntimeException构造函数是否支持继承?为何默认构造可用带参报错?

Java构造函数继承的疑问与解析

问题场景

我编写了一个继承自RuntimeException的类及相关代码:

public class MyException extends RuntimeException {
  // 未实现任何构造方法;
  // 原本以为该类会继承父类的构造方法;
}

public static void main(String[] args) {
  String msg = "msg";
  MyException baseException = new MyException(); // 编译无错误
  MyException baseException2 = new MyException(msg); // 编译错误:需要0个参数,但找到1个
}

观察发现,MyException似乎继承了RuntimeException的默认构造方法,但却没有继承带参数的RuntimeException(String message)构造方法。

请问这是预期行为吗?Java为何要这样设计?

我曾看到过关于Java构造函数继承的讨论,但其中提到“Java不支持构造函数继承”,这和我的观察矛盾——我明明能调用无参构造方法,却不能调用带参的,因此我对这个结论存疑。

正确解答

MyException的无参构造方法并非来自继承,而是由编译器自动添加的:

  • 当一个类没有显式定义任何构造方法时,Java编译器会自动为它生成一个默认的无参构造方法。这个默认构造方法会直接调用父类的无参构造方法(即super())。
  • 一旦你显式定义了任何构造方法,编译器就不会再生成默认构造方法。
  • 构造方法本身是不能被继承的,父类的带参构造方法不会自动成为子类的构造方法,如果你想让子类拥有带参构造方法,必须显式定义,并在其中通过super(参数)调用父类对应的带参构造方法。

所以你遇到的编译错误是预期行为:MyException只有编译器自动生成的无参构造方法,没有带参构造方法,因此无法通过new MyException(msg)创建实例。


内容的提问来源于stack exchange,提问作者leo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 22:17:14