我去'刷新'我的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