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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:09:20