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

Java子类打印参数默认值而非赋值值,请求排查错误原因

排查Java继承中输出0和null的问题

嘿,这个问题我之前帮不少开发者踩过坑,大概率是构造方法调用逻辑或者成员变量隐藏导致的,咱们一步步拆解:

最常见的原因:子类未显式调用父类带参构造

假设你的代码结构大概是这样(我还原了常见错误场景):

class Animal {
    int age;
    String sound;

    // 父类的带参构造,用来初始化成员变量
    public Animal(int age, String sound) {
        this.age = age;
        this.sound = sound;
    }

    // 如果你手动加了无参构造(或者父类本来就有)
    public Animal() {
        // 这里age默认是0,sound默认是null
    }
}

class Lion extends Animal {
    public Lion(int age, String sound) {
        // 注意!这里编译器会自动插入一行`super()`,调用父类的无参构造
        // 你传入的30和"roars"根本没传到父类的带参构造里
    }

    public void printInfo() {
        System.out.println(age);
        System.out.println(sound);
    }
}

// 测试代码
public class Main {
    public static void main(String[] args) {
        Lion lion = new Lion(30, "roars");
        lion.printInfo(); // 输出0和null
    }
}

问题根源

Java规定:子类构造方法如果没有显式调用super(参数)或者this(参数),编译器会自动在构造方法的第一行插入super()(调用父类的无参构造)。这时候父类的成员变量会被初始化为默认值(int类型默认0,引用类型默认null),你传入的参数根本没被用来初始化父类的成员。

解决方法

在子类构造方法的第一行,显式调用父类的带参构造,把参数传递进去:

class Lion extends Animal {
    public Lion(int age, String sound) {
        super(age, sound); // 把传入的参数传给父类构造,完成初始化
    }
}

第二种可能:子类定义了同名成员变量,导致隐藏

如果你在子类里自己定义了和父类同名的age或sound,就会隐藏父类的成员变量,比如:

class Lion extends Animal {
    int age; // 子类自己的age,隐藏了父类的age
    String sound; // 同理隐藏父类的sound

    public Lion(int age, String sound) {
        // 这里没给子类的age和sound赋值,所以它们是默认值
    }

    public void printInfo() {
        // 这里访问的是子类自己的成员,不是父类的
        System.out.println(age);
        System.out.println(sound);
    }
}

解决方法

  • 如果你不需要子类自己的成员变量,直接删除子类中同名的age和sound,继承父类的即可;
  • 如果确实需要子类自己的成员,就在构造方法里给它们赋值:
public Lion(int age, String sound) {
    this.age = age;
    this.sound = sound;
}

你可以对照自己的代码检查这两个点,应该就能解决问题啦!

内容的提问来源于stack exchange,提问作者Nobi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:07:56