我去'刷新'我的Java,只是意识到,显然我不懂基本概念!这里有一个简单的我想不通: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;
}
}
OK,和子类:
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机器人类型:类com.akarpov.tutorial.Terminator
- 制作T1000终止,类型:类com.akarpov.tutorial.Terminator
因此,我看到Java发现我的类的运行时实例是Terminator,这是被告知要做什么的新事实。显然,终结者实例确实保留了模型==“T1000”的副本。但在调试器(IntelliJ)中检查r1对象我在不同的地址(显然)使用不同的字符串看到名为'model'的变量两个。显然,如输出所示,抽象类中的getModel将拾取Robot类中定义的默认值,而不是传递给Terminator构造函数(并保留在对象内)的默认值。
这是什么我不明白抽象类和继承,以及我将如何去有一个默认值和默认行为(即getModel),其中拿起一个特定的数据(即“T1000”)在一个子类? 谢谢!如果这个问题已经被解决了很多次,我很抱歉 - 我看了看,但没有看到我跳过。
你说得对,当然 - 这是我在发布2分钟后意识到的。不过,我已经接受了答案,否则我会选择你的! – alexakarpov