作者Shrugg (淚眼問花花不語)
看板java
標題[問題] 父變數指到子物件的繼承問題
時間Sat Apr 27 14:31:14 2013
對不起,又碰到觀念性問題想不通了,所以藉休息思考時間又來這邊尋找溫情.嘻
請問當程式跑到 Father f = new Son()後,從記憶體來看
不是就一個Stack區的變數f指向Heap區的一個Son物件嗎?
如果這時候執行f.show() 為什麼IntelliSense只能選擇父類別裡的show()?
但是如果父類跟子類同時有定義show(),即使選用的是父類的show()
卻是顯示子類show()的內容呢?
從物件來看,父類跟子類會有不同的方法跟成員變數,可以理解是不同的東西
但是變數的目的不是存值就是存參照,變數為什麼會有父跟子的區分呢?
謝謝.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 137.132.239.190
1F:推 coolcomm:把編譯時期和執行時期做的事搞清楚 04/27 14:54
2F:→ coolcomm:`f` 不一定要指向一個 `Son` 類別的物件 04/27 14:57
請問您的意思是,編譯器是根據宣告來設定IntelliSense的? 雖然這邊參照到子類
但是賦值是執行時期的問題? 所以要正常編譯成功,編譯時期只能選用父類有的方法
執行時期因為真正參照到的物件是子類,所以我們其實是拿編譯時期的父類方法來執行
執行時期的子類參照? 也就是要執行時期讓父類變數可以執行子類方法,必須要在
父類中定義想要執行的子類方法,這樣才能騙過編譯器而讓子類方法留下來?
※ 編輯: Shrugg 來自: 137.132.239.190 (04/27 15:36)
3F:→ cha122977:override? 04/27 15:33
※ 編輯: Shrugg 來自: 137.132.239.190 (04/27 15:47)
4F:→ andymai:都已經明確寫在程式了~還有分執行和編譯時期? 04/27 16:38
5F:→ coolcomm:我指的就是原po修文裡的意思 思考方式不同而已 04/27 18:37
6F:→ Shrugg:我還是不了解您第二句的意思,為什麼f不一定指向Son物件? 04/27 20:12
7F:→ Shrugg:已經是Father f = new Son();為什麼還說不一定指向Son物件 04/27 20:15
8F:→ Shrugg:還是說您用詞太過精簡了,您的意思是編譯時期編譯器不知道f 04/27 20:20
9F:→ Shrugg:還不知道指向何處,所以是不一定? 直到Runtime才確定? 04/27 20:23
10F:→ andymai:編譯時期知道~但寫的時候可能不知道!彈性的程式就是這樣! 04/27 21:55
11F:→ andymai:直接指定當然知道~但是有時候可能不知道~你也不需要知道! 04/27 21:59
12F:→ andymai:就像新訓班長一開始需要知道入伍生叫啥嗎?不需要!反正叫你 04/27 22:00
13F:→ andymai:動起來~就是給我動起來~管你從哪裡來~媽媽嫁給誰... 04/27 22:07
14F:→ andymai:還是很難體會的話~就試著寫程式~用一種定義控制不同的物件 04/27 22:10
15F:推 KanoLoa:現在單純的多型都要講得這麼深澳嗎... 04/29 02:31
16F:推 coolcomm:結果原po發現每個人都給他一個不同的解釋(逃 04/29 20:04
17F:→ andymai:不同?會嗎?不過這種東西沒實際寫過~還蠻難去體會的... 04/29 21:11