Java子类构造器报错原因咨询:构造器参数列表不匹配问题
Java子类构造器报错原因解析
先看看你写的代码:
class Superr { int k; int g; int l; Superr(int a, int b, int c) { k = a; g = b; l = c; } void show() { System.out.println("value of l" + l); } } class Sub extends Superr { int h; Sub(int a, int b, int c, int d) { e = a; f = b; g = c; l = d; } } class Main { public static void main(String[] args) { Superr b = new Super(1, 2, 3); Sub c = new Sub(1, 2, 3, 4); } }
运行后抛出的错误:
constructor super from class super cannot be applied to given types
required: int,int,int
found: no arguments
reason: actual and formal argument lists differ in length
问题根源
这是Java继承机制里的一个关键规则:子类的构造器必须调用父类的构造器,而且这个调用必须是子类构造器里的第一个语句。
当你没有在子类构造器里显式写super(...)时,Java会自动帮你插入一句super()——也就是调用父类的无参构造器。但你的父类Superr只定义了一个带3个int参数的构造器,没有默认的无参构造器(记住:Java只有在你完全没写任何构造器的时候,才会自动给类生成一个无参构造器)。
所以当Sub的构造器执行时,Java试图调用父类的无参构造器,但父类根本不存在这个构造器,自然就会抛出参数列表不匹配的错误。
修复方案
你需要在子类构造器的第一行显式调用父类的带参构造器,同时修正代码里的其他小错误:
class Sub extends Superr { int h; Sub(int a, int b, int c, int d) { super(a, b, c); // 显式调用父类的3参数构造器,必须放在第一行 h = d; // 修正未定义变量的问题,子类只有h成员 // 父类的g、l已经通过super初始化了,不需要重复赋值,除非你有特殊需求要覆盖 } } // 同时Main里的父类对象创建要修正类名 class Main { public static void main(String[] args) { Superr b = new Superr(1, 2, 3); // 把Super改成Superr Sub c = new Sub(1, 2, 3, 4); } }
额外提醒
- 只要你给类手动写了构造器,Java就不会再自动生成无参构造器,这是很多新手容易踩的坑。
- 子类构造器里的
super()调用必须是第一个语句,不能放在其他代码后面。
内容的提问来源于stack exchange,提问作者Martin.B
相关产品推荐
相关产品推荐

