Re: [問題] 父變數指到子物件的繼承問題
※ 引述《andymai (人生只有一次)》之銘言:
: 標題: Re: [問題] 父變數指到子物件的繼承問題
: 時間: Sat Apr 27 16:36:57 2013
:
: ※ 引述《Shrugg (淚眼問花花不語)》之銘言:
: : 對不起,又碰到觀念性問題想不通了,所以藉休息思考時間又來這邊尋找溫情.嘻
: : 請問當程式跑到 Father f = new Son()後,從記憶體來看
: : 不是就一個Stack區的變數f指向Heap區的一個Son物件嗎?
: : 如果這時候執行f.show() 為什麼IntelliSense只能選擇父類別裡的show()?
: : 但是如果父類跟子類同時有定義show(),即使選用的是父類的show()
: : 卻是顯示子類show()的內容呢?
: : 從物件來看,父類跟子類會有不同的方法跟成員變數,可以理解是不同的東西
: : 但是變數的目的不是存值就是存參照,變數為什麼會有父跟子的區分呢?
: : 謝謝.
: 把 Father 換成 動物
: 把 Son 換成 鴨子
: 把 show 換成 走
: 即:
:
: 動物 f = new 鴨子();
:
: 定義 f 為動物,而且這個動物是鴨子
: 而在操作的時候,光看 f 怎麼會知道它是鴨子還是鳥~或是別的動物?
: 所以當然只能選擇父類別(動物)裡的 走()
Java 是嚴格的靜態語言,
但 Java 的靜態型別卻只存在於編譯時期,換句話說,只是編譯時期檢查而已。
* * *
宣告一個靜態型別為`動物`的變數 `f` ,參考至`鴨子`型態的新物件
而在編譯時期,光看 `f` 怎麼會知道它的動態型別會是`鴨子`還是`鳥`~或是其他`動物`
的子類別?
所以當然只能選擇靜態型別(`動物`)裡的 `走()`
底下是一個範例
class 動物 {}
class 鴨子 extends 動物 {
@Override
public String toString() {
return "呱呱";
}
}
class 鳥 extends 動物 {
@Override
public String toString() {
return "啾啾";
}
}
public class Main {
public static void main(String args[]) {
動物 f;
if(args[0].equals("鴨子")) f = new 鴨子();
else if(args[0].equals("鳥")) f = new 鳥();
else f = new 動物();
System.out.println(f);
}
}
(......以下恕刪)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 123.110.151.94
推
04/27 20:53, , 1F
04/27 20:53, 1F
已修改。
※ 編輯: coolcomm 來自: 101.15.200.10 (04/29 20:06)
討論串 (同標題文章)