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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:48:04