Re: [J2SE] 多型與轉型

看板java作者 (QQ)時間16年前 (2009/07/15 09:55), 編輯推噓2(206)
留言8則, 5人參與, 最新討論串6/7 (看更多)
※ 引述《kun25086 (我是宅宅)》之銘言: : ※ 引述《forris (喬巴)》之銘言: : : class Father{ : : String name = "Father"; : : String getName(){ : : return name; : : } : : String greeting(){ : : return "class Father"; : : } : : } : : class Son extends Father{ : : String name = "Son"; : : String greeting(){ : : return "class Son"; : : } : public static void main ( String[] args ) { : Father father = new Son(); : System.out.print( father.greeting() ); : System.out.print( father.name ); : System.out.print( father.getName() ); : } : : } : 想請問在main裡的程式, : 輸出的結果是 class Son , Father , Father : 爬文後小弟對於輸出的結果有些不了解,想請問各位小弟的觀念哪裡有問題? : Father father = new Son() ; <== 一個叫作father的東西,長得像Father, : 但實體是Son。 : 所以第一個print ( father.greeting() ) ; 會去找Son裡面的greeting(), : (因為實體是son嘛),也因此印出來的東西是 class Son。 : 第三個print ( father.getName() ); 會去Son裡找getName(),但由於Son裡沒有, : 所以會去父類別裡找getName(),因此印出來是Father。 : 不過第二個,為什麼不是在Son裡面找name,而是去Father裡面找name呢? : 是因為屬性和方法是不一樣的做法嗎? 還是小弟我的觀念有問題? : 煩請各位高手幫我解答一下,感恩! 整個流程就是以Father 為主,當你呼叫Father 的成員函數的時候 會先在Father 找有沒有這個函數,找到之後會去找Son的類別裡面看看有沒有overriding 如果有會取代,沒有就用Father自己的函式 但是對於屬性來說,不是這樣處理,你呼叫誰就是誰 當Father 跟Son 都有name,這個name 在Son裡面是重新宣告的跟Father一點關係都沒有 所以當你呼叫Father.name 跟 Son.name 是呼叫各自的name 如果你改成 一個private 跟public 你會比較清楚 重點是 你為什麼要寫 Father father = new Son(); 甚麼情況下你會用到這個寫法? 除了考試的情況外 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 203.70.121.30

07/15 10:47, , 1F
反對你最後2句,要多型本來就是要這樣子用
07/15 10:47, 1F

07/15 10:52, , 2F
我是指... 那樣的寫法 很常見吧
07/15 10:52, 2F

07/15 11:21, , 3F
單純看最後兩句... 天天用耶.... XDXD
07/15 11:21, 3F

07/15 11:41, , 4F
想必是名字的問題... XD father = new son ???
07/15 11:41, 4F

07/15 13:55, , 5F
所以是我的觀念也有問題囉,主要還是以Father為主,只是
07/15 13:55, 5F

07/15 13:57, , 6F
方法還會去Son裡找有沒有overriding,而屬性不會囉?
07/15 13:57, 6F

07/15 14:30, , 7F
可以這樣說
07/15 14:30, 7F

07/17 16:52, , 8F
感謝所有高手的解答!感恩!
07/17 16:52, 8F
文章代碼(AID): #1ANJRwnR (java)
討論串 (同標題文章)
文章代碼(AID): #1ANJRwnR (java)