Java中Dwarves类缺省构造器未定义问题及数组打印需求
解决Dwarves类构造器报错与数组元素打印问题
嘿,我来帮你搞定这个Java作业的问题~ 你遇到的两个核心问题我给你拆解清楚,再给出修改后的代码:
问题分析
- 缺省构造器未定义报错:你在
Dwarves类里自定义了带String参数的构造器Dwarves(String name),Java编译器就不会自动生成无参构造器了,所以main方法里new Dwarves()会直接报错。 - 无法正确打印矮人名字:你当前的
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
相关产品推荐
相关产品推荐

