我有一個關於在Java中繼承和鑄造的問題。我有以下兩個示例類和一個測試類,我陳述的類後,我的問題:在Java中繼承和鑄造
public class Automobile {
public int var;
public Automobile() {
var = 1;
}
public String toString() {
return "AUTOMOBILE: " + var;
}
}
public class Porsche extends Automobile {
public int var;
public Porsche() {
var = 2;
}
public String toString() {
return "PORSCHE: " + var;
}
}
public class Test {
public static void main (String [] args) {
Porsche p = new Porsche();
Automobile a = new Automobile();
System.out.println ("(Automobile) p = " + (Automobile)p);
System.out.println ("(Automobile) p.var = " + ((Automobile)p).var);
}
}
輸出是:
(Automobile) p = PORSCHE: 2
(Automobile) p.var = 1
我不明白,爲什麼在第二個發言中,我們有1。不是2?因爲在我的第一個語句投p來汽車我仍然得到PORSCHE: 2
爲p
表示 - 我明白這一點通過以下方式:
不過我已經鑄造p
到汽車p
保持其「本來面目」 - p
是這是保時捷課程的一個對象,但由於保時捷延續了汽車,我們可以說P也是汽車。因此,當我們明確地將其投放到汽車時,它會繼續使用其方法 - 在 我們的情況下,在保時捷中定義的方法toString()
。
在另一方面,如果我寫的東西是正確的,那麼第二個print語句應該給2,而不是1
現在,這似乎是一個矛盾的我,但因爲這部作品在Java中,似乎我不明白在投射和繼承過程中發生了什麼。