我去“刷新”我的Java,却发现显然我不懂基本概念!这是一个我无法弄清楚的简单问题:
public abstract class Robot {
private String model = "NONAME";
public Robot() {
System.out.println("Making a generic " + model + " robot, type: " + this.getClass());
}
public String getModel() {
return model;
}
}
好的,子类:
public class Terminator extends Robot {
private String model;
public Terminator(String model) {
super();
System.out.println("Making a " + model + " terminator, type: " + this.getClass());
this.model = model;
}
}
然后我运行一个简单的示例,期望打印“T1000”:
Robot r1 = new Terminator("T1000");
System.out.println(r1.getModel());
没有骰子!打印“NONAME”。在此之前,我从构造函数中得到这个输出:
- 制作一个通用的 NONAME 机器人,输入:class com.akarpov.tutorial.Terminator
- 制作 T1000 终结器,输入:class com.akarpov.tutorial.Terminator
所以,好吧,我看到 Java 发现了我的类的运行时实例是 Terminator,这是告诉“新”来制作的。而且,显然,终结者实例确实保留了模型 ==“T1000”的副本。但是在调试器(IntelliJ)中检查 r1 对象,我看到两个名为“模型”的变量,位于不同的地址(显然),具有不同的字符串。而且,显然,正如输出所暗示的,抽象类中的 getModel 选择了 Robot 类中定义的默认值,而不是传递给 Terminator 的构造函数(并保留在对象中)的默认值。
关于抽象类和继承,我不了解什么,我将如何获得默认值和默认行为(即 getModel),它在子类中获取特定数据(即“T1000”)?谢谢!如果这已经被多次回答过,我很抱歉——我看了看,但没有任何反应。