Corsair

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

          我們知道,在子類繼承父類之后,如果子類與父類有同名的字段和方法,那么子類中的子段會(huì)代替或隱藏父類的子段,說明子類字段覆蓋了超類字段,但可以通過super關(guān)鍵字去訪問超類字段。但是,在我們將子類對象向超類轉(zhuǎn)型的時(shí)候就會(huì)發(fā)生這個(gè)奇怪的現(xiàn)象,子類對象居然可以看到父類曾經(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他說:
          ???一定要注意:當(dāng)把子類轉(zhuǎn)換成超類時(shí),子類可以見到或訪問被隱藏的同名變量。Java允許名字重復(fù)的原因是,允許將來把新的字段加到超類中,而不影響已經(jīng)使用了該名字的現(xiàn)有子類,子類將會(huì)繼續(xù)使用自己的字段副本。除非讓子類以超類對象的形式出現(xiàn),方法可以覆蓋,但是字段不能被覆蓋。注意:最好不要隱藏超類中的字段名。
          ?????
          所以我們在進(jìn)行向上轉(zhuǎn)型的時(shí)候一定要注意:不要訪問子類中那些“覆蓋”掉父類的字段(它并沒有真正覆蓋掉,在向上轉(zhuǎn)型的時(shí)候就可以訪問的到),要么將子類字段改名(在你知道父類代碼的情況下),要么通過方法來訪問字類字段(方法即使同名也肯定能覆蓋掉)。

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

          評論

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

          變量都是靜態(tài)綁定,只有實(shí)例方法才是動(dòng)態(tài)綁定。或者說只有方法才有多態(tài),而變量是沒有的
            回復(fù)  更多評論    

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

          @dennis
          恩,謝謝賜教,又學(xué)到新東西了~~
            回復(fù)  更多評論    
          主站蜘蛛池模板: 磐安县| 景洪市| 临朐县| 江安县| 清流县| 敦煌市| 苏尼特右旗| 万全县| 福安市| 南昌市| 牡丹江市| 宜兴市| 林甸县| 武宁县| 瓦房店市| 杭锦后旗| 伊金霍洛旗| 大兴区| 宜宾市| 弋阳县| 鲜城| 德格县| 宾阳县| 徐汇区| 永川市| 文水县| 武冈市| 石嘴山市| 济南市| 子洲县| 敖汉旗| 德清县| 长武县| 芷江| 普陀区| 长宁区| 平原县| 太和县| 南岸区| 商城县| 新昌县|