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

Java中Dwarves类缺省构造器未定义问题及数组打印需求

解决Dwarves类构造器报错与数组元素打印问题

嘿,我来帮你搞定这个Java作业的问题~ 你遇到的两个核心问题我给你拆解清楚,再给出修改后的代码:

问题分析

  1. 缺省构造器未定义报错:你在Dwarves类里自定义了带String参数的构造器Dwarves(String name),Java编译器就不会自动生成无参构造器了,所以main方法里new Dwarves()会直接报错。
  2. 无法正确打印矮人名字:你当前的identify()方法打印的是speler[i](即Dwarves对象的引用),会输出类似prac11.Dwarves@xxxxxxx的哈希码,而不是你想要的矮人名字。

修改后的代码

Dwarves类

package prac11;
public class Dwarves {
    Dwarves[] speler;
    // 初始化块创建数组
    {
        speler = new Dwarves[8];
    }
    public String name;

    // 手动添加无参构造器,解决main中创建对象的问题
    public Dwarves() {
        // 无参构造器可以留空,也可以给name设置默认值比如this.name = "Unknown";
    }

    // 带名字参数的构造器
    Dwarves(String name) {
        this.name = name;
    }

    public void generate() {
        speler[0] = new Dwarves("Muir");
        speler[1] = new Dwarves("Buith");
        speler[2] = new Dwarves("Gort");
        speler[3] = new Dwarves("Coll");
        speler[4] = new Dwarves("Duir");
        speler[5] = new Dwarves("Quert");
        speler[6] = new Dwarves("Nion");
        speler[7] = new Dwarves("Gus");
    }

    public void identify() {
        for (int i = 0; i < speler.length; i++) {
            // 修改为打印对象的name属性,而不是对象引用
            System.out.println("I am " + speler[i].name);
        }
    }

    public void killDwarf(String name) {
        // 补充实现删除矮人的逻辑(可选)
        for (int i = 0; i < speler.length; i++) {
            if (speler[i] != null && speler[i].name.equals(name)) {
                speler[i] = null;
                break;
            }
        }
    }

    // 可选:重写toString方法,后续直接打印Dwarves对象时也能输出名字
    @Override
    public String toString() {
        return name;
    }
}

SnowWhite类(main方法)

package prac11;
public class SnowWhite {
    public static void main(String[] args) {
        Dwarves figure = new Dwarves(); // 现在有了无参构造器,不会报错
        figure.generate();
        figure.identify();
    }
}

关键说明

  • 无参构造器的必要性:只要你自定义了构造器,Java就不会自动生成无参构造器,所以必须手动添加才能用new Dwarves()创建对象。如果你不想加无参构造器,也可以在main里传任意字符串,比如Dwarves figure = new Dwarves("Dwarf Manager");,同样能解决报错问题。
  • 正确打印属性:要访问对象的name属性才能输出矮人名字,直接打印对象会输出其内存地址相关的哈希码。
  • 可选优化:重写toString()方法后,不管是在identify()里直接打印speler[i],还是其他地方打印Dwarves对象,都会输出名字,代码更灵活。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 08:43:13