java 板


LINE

這題是繼承和有沒使用到多型的問題。 有請打開Debugger,以Eclipse為例 在child c1 =new child();的下一行下斷點。 然後打開c1,你會發現有兩個i,一個是來自parent,一個是child本身。 什麼?你不相信我? 為證明我說的,我把程式稍微加料一下。 在parent p1 =new parent();的下一行加上c1.showSuper(); 然後在class child裡面加上 void showSuper() { System.out.println("show c1.super.i: "+super.i); } 這樣就應該了解了。 另外, 如果你有使用C/C++也可以把你原本的code改成C/C++的版本。 像是Visual Studio 2012 Desktop Expression是免費的, 打開Debugger來跑,你會看到child裡面還會有一個parent的分支可以打開。 這個Debugger算是做的比較清楚的。 最後, 雖然Java沒辦法操作指標,但物件指向相當於指標指向的概念。 那toString()是把指標的值印出來。 而C/C++有個%p可以把指標的值印出來 所以你在C/C++下 1 cout << "address of p = " << &p << endl; 2 cout << "address of c = " << &c << endl; 3 printf("value of p = %p\n", p); 4 printf("value of c = %p\n", c); 列1, 2永遠不會變的,就是指標本身在記憶體裡面的位址。 列3, 4在p轉向c之後,兩個值會一樣。就是toString()所呈現的。 ※ 引述《orze04 (orz)》之銘言: : public class QQ { : public static void main(String[] args){ : child c1 =new child(); : parent p1 =new parent(); : System.out.println(p1.toString()+" "+c1.toString()); : System.out.println("p1.i: "+p1.i); : p1.show(); : System.out.println("c1.i: "+c1.i); : c1.show(); : System.out.println(""); : p1=c1; : System.out.println(p1.toString()+" "+c1.toString()); : System.out.println("p1.i: "+p1.i); : p1.show(); : System.out.println("c1.i: "+c1.i); : c1.show(); : System.out.println(""); : } : } : class parent{ : int i; : parent(){} : void show(){ : System.out.println("show p1.i: "+i); : } : } : class child extends parent{ : int i=1; : child(){} : void show(){ : System.out.println("show c1.i: "+i); : } : } : result: : parent@14a55f2 child@15093f1 : p1.i: 0 : show p1.i: 0 : c1.i: 1 : show c1.i: 1 : child@15093f1 child@15093f1 : p1.i: 0 <<~~!? : show c1.i: 1 : c1.i: 1 : show c1.i: 1 : 在執行p1=c1後 : 透過hashCode可以看到p1和c1已經變成同樣內容 : 為何要顯示p.i時還是指向parent的class? : 還是說p1=c1只有methodc會被蓋掉,本身成員變數不會? --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.43.112.210
1F:推 orze04:我的意思是為何"p1.i"還會指向原本p1.i的記憶體位置? 03/26 19:17
2F:→ bleed1979:c1包含有parent的i,當p1指向c1時取i是取c1的parent的i 03/26 19:20
3F:推 orze04:噢噢 這樣我就懂了 03/26 19:39
4F:→ mars90226:簡單來說,看型別決定用哪個i 03/26 19:55
5F:推 dahanhsi:那為什麼用show()的時候會拿到1呢? 03/26 20:09
6F:→ bleed1979:一開始有講是多型的問題。。。 03/26 20:17
7F:→ ssccg:這不止是多型問題,而是java預設在child class有同名的時候 03/27 02:03
8F:→ ssccg:method就是override而不是shadow 03/27 02:06
9F:→ ssccg:但像C++、C#是有virtual的method才是override,否則是shadow 03/27 02:07
10F:→ ssccg:而成員變數在各語言都是shadow,因為直接存取變數已經連封裝 03/27 02:12
11F:→ ssccg:都沒了,如果要多型要對getter/setter做 03/27 02:14
12F:→ bleed1979:只有parent有getI()但child僅繼承getI()的情況 03/27 02:24
13F:→ bleed1979:沒method override就仍會是parent的。 03/27 02:33
14F:→ bleed1979:應該不是"不止",而是"就是"多型效果有沒有出來的問題。 03/27 02:44







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BuyTogether站內搜尋

TOP