Corsair

          My javaWorld
          數(shù)據(jù)加載中……
          向上轉(zhuǎn)型中子類(lèi)將能看到父類(lèi)被覆蓋字段的現(xiàn)象探討

          我們知道,在子類(lèi)繼承父類(lèi)之后,如果子類(lèi)與父類(lèi)有同名的字段和方法,那么子類(lèi)中的子段會(huì)代替或隱藏父類(lèi)的子段,說(shuō)明子類(lèi)字段覆蓋了超類(lèi)字段,但可以通過(guò)super關(guān)鍵字去訪問(wèn)超類(lèi)字段。但是,在我們將子類(lèi)對(duì)象向超類(lèi)轉(zhuǎn)型的時(shí)候就會(huì)發(fā)生這個(gè)奇怪的現(xiàn)象,子類(lèi)對(duì)象居然可以看到父類(lèi)曾經(jīng)被覆蓋掉的字段!就正如下面例子中一樣:

          ?1?class?A{
          ?2?????boolean?bb?=false;
          ?3?}
          ?4?
          ?5?public?class?B?extends?A{
          ?6?????boolean?bb?=?true;
          ?7?????//int?a=1;
          ?8?????public?static?void?main(String[]?args)?{
          ?9?????????B?b?=new?B();
          10?????????A?a?;
          11?????????a=?b;
          12?????????//---??
          13?????????System.out.println(a.bb);
          14?????????//---這句可以理解
          15?????????System.out.println(b.bb);
          16?????????//---??
          17?????????System.out.println(?((A)b).bb);
          18?????????//----
          19?????}
          20?????/*運(yùn)行結(jié)果
          21??????*?false
          22??????*?true
          23??????*?false
          24??????*?*/
          25?}

          為什么會(huì)發(fā)生這樣的情況呢?
          關(guān)于這種情況的解釋在[美]Peter van der Linden著的《Just Java2》中有了答案:
          P106他說(shuō):
          ???一定要注意:當(dāng)把子類(lèi)轉(zhuǎn)換成超類(lèi)時(shí),子類(lèi)可以見(jiàn)到或訪問(wèn)被隱藏的同名變量。Java允許名字重復(fù)的原因是,允許將來(lái)把新的字段加到超類(lèi)中,而不影響已經(jīng)使用了該名字的現(xiàn)有子類(lèi),子類(lèi)將會(huì)繼續(xù)使用自己的字段副本。除非讓子類(lèi)以超類(lèi)對(duì)象的形式出現(xiàn),方法可以覆蓋,但是字段不能被覆蓋。注意:最好不要隱藏超類(lèi)中的字段名。
          ?????
          所以我們?cè)谶M(jìn)行向上轉(zhuǎn)型的時(shí)候一定要注意:不要訪問(wèn)子類(lèi)中那些“覆蓋”掉父類(lèi)的字段(它并沒(méi)有真正覆蓋掉,在向上轉(zhuǎn)型的時(shí)候就可以訪問(wèn)的到),要么將子類(lèi)字段改名(在你知道父類(lèi)代碼的情況下),要么通過(guò)方法來(lái)訪問(wèn)字類(lèi)字段(方法即使同名也肯定能覆蓋掉)。

          posted on 2007-03-31 11:31 銀河海盜 閱讀(715) 評(píng)論(2)  編輯  收藏 所屬分類(lèi): JAVA

          評(píng)論

          # re: 向上轉(zhuǎn)型中子類(lèi)將能看到父類(lèi)被覆蓋字段的現(xiàn)象探討 2007-04-01 19:07 dennis

          變量都是靜態(tài)綁定,只有實(shí)例方法才是動(dòng)態(tài)綁定。或者說(shuō)只有方法才有多態(tài),而變量是沒(méi)有的

          # re: 向上轉(zhuǎn)型中子類(lèi)將能看到父類(lèi)被覆蓋字段的現(xiàn)象探討 2007-04-02 20:17 銀河海盜

          @dennis
          恩,謝謝賜教,又學(xué)到新東西了~~
          主站蜘蛛池模板: 哈尔滨市| 上林县| 台州市| 永靖县| 雷波县| 台安县| 广汉市| 裕民县| 邮箱| 大庆市| 泰和县| 江达县| 礼泉县| 资兴市| 德化县| 津南区| 温宿县| 自贡市| 泉州市| 凌海市| 宜宾县| 广德县| 高平市| 连平县| 原平市| 琼海市| 普洱| 修水县| 南岸区| 海门市| 汨罗市| 礼泉县| 兴城市| 安化县| 固原市| 祁连县| 紫云| 武川县| 涿州市| 桦川县| 苏尼特右旗|