我目前正在学习Java的多态性,部分任务是创建一个程序,该程序将使用继承和多态性打印出各种子类。我尝试寻找解决方案,但我似乎找不到遇到此问题的其他任何人。
下面是一段代码,应该分别打印Alex
和Alexa
。但是,输出是Alexa
Alexa
.
我已经尝试通过使用 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
}
}
这里有几点错误:
-
name
不应该是静态的。您希望为每个实例(对象(创建一个name
实例。 -
您打印了错误的
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;
}
}