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
相关产品推荐
相关产品推荐

