为什么我的 ArrayList 只打印出最后一个被调用的子类?



我目前正在学习Java的多态性,部分任务是创建一个程序,该程序将使用继承和多态性打印出各种子类。我尝试寻找解决方案,但我似乎找不到遇到此问题的其他任何人。

下面是一段代码,应该分别打印AlexAlexa。但是,输出是AlexaAlexa.

我已经尝试通过使用 Eclipse 逐步进行调试,但我无法确定错误是什么。在这一点上我真的很困惑,过去一周我一直在尝试这个问题,但无济于事。如果这是一个简单的问题,请原谅我,但我无法弄清楚出了什么问题。我将不胜感激任何帮助!

import java.util.ArrayList;
public class Human {
protected static String name;
public Human(String name) {
System.out.println("In human constructor");
this.name = name;
}
void greetings() {}
static void print(Human human) {
System.out.println(name);
}
public static void main(String[] args) {
ArrayList<Human> human = new ArrayList<Human>();
human.add(new Man("Alex"));
human.add(new Woman("Alexa"));
for (int i = 0; i < human.size(); i++) {
print(human.get(i));
}
}
}
class Man extends Human {
public Man(String name) {
super(name);
// TODO Auto-generated constructor stub
}
}
class Woman extends Human {
public Woman(String name) {
super(name);
// TODO Auto-generated constructor stub
}
}

这里有几点错误:

  1. name不应该是静态的。您希望为每个实例(对象(创建一个name实例。

  2. 您打印了错误的name。您要打印传递到print()的实例的name。所以你会想要这样的东西(你会为name创建一个 getter 方法(:

static void print(Human human) {
System.out.println(human.getName());
}

每个人都有自己的名字,无论是男人还是女人。

所以从中删除静态关键字

protected static String name;

这是因为您已将name定义为静态字段。 因此,在每个对象中,它将具有相同的值。 只需从名称中删除static即可。

protected String name;

当变量、方法、...定义为static,您可以在不创建对象的情况下访问它。同时,它将在每个对象中具有相同的值。因此,如果您正在修改静态变量,它将保留上次修改。

查看此链接以获取更多信息。

对静态上下文进行一些研究。这是您问题的一部分:

protected static String name;

name设为静态意味着它属于Human类。这意味着类Human的每个对象都将具有相同的名称。

如果希望Human对象具有不同的名称,请删除该static修饰符。

接下来,Human可能应该是一个 POJO,而不是您的主类。 像这样:

public class Test {
public static void main(String[] args) {
Human human = new Human("Steve");
System.out.println(human.getName());
}
}
class Human {
private String name;
Human(String s) {
this.name = s;
}
public String getName() {
return this.name;
}
}

最新更新