作者conanist (QQ)
看板java
標題Re: [J2SE] 多型與轉型
時間Wed Jul 15 09:55:05 2009
※ 引述《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
→ neigence:反對你最後2句,要多型本來就是要這樣子用 07/15 10:47
→ neigence:我是指... 那樣的寫法 很常見吧 07/15 10:52
推 PsMonkey:單純看最後兩句... 天天用耶.... XDXD 07/15 11:21
→ godfat:想必是名字的問題... XD father = new son ??? 07/15 11:41
推 kun25086:所以是我的觀念也有問題囉,主要還是以Father為主,只是 07/15 13:55
→ kun25086:方法還會去Son裡找有沒有overriding,而屬性不會囉? 07/15 13:57
→ adrianshum:可以這樣說 07/15 14:30
→ kun25086:感謝所有高手的解答!感恩! 07/17 16:52