Java父类与子类带参构造函数测试未得预期输出求助
解决Java子类构造函数调用父类带参构造的问题
嘿,我来帮你捋清楚这个问题!你这段代码其实连编译都通不过,更别说得到预期输出了,核心原因是没搞懂Java中子类构造函数调用父类构造的规则,我给你拆解一下:
首先先看你写的原始代码:
class A { A(int i) { System.out.println(i); } } class B extends A { B(int i, int j) { System.out.println(i+j); } } public class Test { public static void main(String args[]) { B b = new B(5,7); } }
问题出在哪?
- 当你给父类
A定义了带参构造函数A(int i)之后,Java编译器不会再自动生成默认的无参构造函数,也就是说现在A只有这一个带参构造可用。 - 子类的构造函数在执行自身代码之前,必须先调用父类的构造函数。如果你没在子类构造里显式写
super(...),编译器会自动帮你加一句super();——也就是调用父类的无参构造,但你的父类A根本没有无参构造,所以编译直接报错,代码根本跑不起来。
怎么修正?
你需要在子类B的构造函数第一行显式调用父类的带参构造super(...),比如你想把参数i传给父类,就这么写:
class A { A(int i) { System.out.println(i); } } class B extends A { B(int i, int j) { super(i); // 显式调用父类带参构造,必须放在构造函数的第一行 System.out.println(i+j); } } public class Test { public static void main(String args[]) { B b = new B(5,7); } }
运行结果
这样修改后,运行代码会先输出父类构造的内容:5,然后输出子类构造的内容:12,这就是符合预期的输出啦。
补充知识点
- 子类构造必须调用父类构造,二选一:要么显式用
super(参数列表)调用父类的带参构造,要么让编译器自动加super()(但前提是父类有无参构造)。 - 只有当一个类完全没有定义任何构造函数时,编译器才会自动生成一个无参构造;只要你自己写了构造(不管带不带参),默认无参构造就没了。
内容的提问来源于stack exchange,提问作者Hitesh Ahirwar
相关产品推荐
相关产品推荐

