Re: [問題] 父變數指到子物件的繼承問題

看板java作者 (coolcomm)時間11年前 (2013/04/27 20:48), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串3/5 (看更多)
※ 引述《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)
文章代碼(AID): #1HUyapue (java)
討論串 (同標題文章)
文章代碼(AID): #1HUyapue (java)