2020国产成人精品视频,性做久久久久久久久,亚洲国产成人久久综合一区,亚洲影院天堂中文av色

分享

關(guān)于靜態(tài)方法的覆蓋

 java-jane 2012-09-12

封裝、繼承、多態(tài)是面向?qū)ο缶幊讨腥齻€(gè)比較重要的概念,理解這3個(gè)概念對(duì)領(lǐng)會(huì)JAVA語(yǔ)言至關(guān)重要,而搞懂方法的覆蓋又是理解繼承的關(guān)鍵部分,這里主要看一下靜態(tài)方法的覆蓋。

  首先看一段代碼:

java 代碼
  1. class Super{   
  2.    static String greeting(){   
  3.       return "Good night";   
  4.   }   
  5.   
  6.   String name(){   
  7.      return "Richard";   
  8.   }   
  9. }   
  10.   
  11. class Sub extends Super{   
  12.    static String greeting(){   
  13.      return "Hello";   
  14.   }   
  15.   
  16.   String name(){   
  17.      return "Dick";   
  18.   }   
  19. }   
  20.   
  21. class Test{   
  22.   public static void main(String[] args){   
  23.     Super s = new Sub();   
  24.     System.out.println(s.greeting()+","+s.name());   
  25.   }   
  26. }  

運(yùn)行Test 類(lèi)的結(jié)果為:Good night,Dick

也許你會(huì)感到迷惑,這里調(diào)用的到底是Super類(lèi)的方法還是Sub子類(lèi)的方法?讓我們首先判斷調(diào)用的是哪個(gè)類(lèi)的name()方法。兩個(gè)類(lèi)中的name()方法都不是靜態(tài)方法而是實(shí)例方法,因?yàn)镾ub 類(lèi)繼承了Super 類(lèi)而且有一個(gè)和它父類(lèi)同樣標(biāo)識(shí)的name()方法,所以Sub 類(lèi)中的name()方法覆蓋了Super 類(lèi)中的name()方法,那么前面提到的變量s 又是Sub 類(lèi)的一個(gè)實(shí)例,這樣一來(lái)s.name()的返回值就是Dick 了。
  至此我們解決了問(wèn)題的一半,現(xiàn)在我們需要判斷被調(diào)用的greeting()方法究竟是Super類(lèi)的還是Sub 類(lèi)的。需要注意的是,兩個(gè)類(lèi)中的greeting()方法都是靜態(tài)方法,也稱(chēng)為類(lèi)方法。盡管事實(shí)上Sub 類(lèi)的greeting()方法具有相同的返回類(lèi)型、相同的方法名以及相同的方法參數(shù),然而它并不覆蓋Super 類(lèi)的greeting()方法。由于變量s 被強(qiáng)制轉(zhuǎn)換為Super 型并且Sub 類(lèi)的greeting()方法沒(méi)有覆蓋Super 類(lèi)的greeting()方法,因此s.greeting()的返回值為Goodnight 。還是很迷惑?請(qǐng)記住這條規(guī)則:“實(shí)例方法被覆蓋,靜態(tài)方法被隱藏” 。假如你就是剛才大喊不能覆蓋靜態(tài)方法的讀者之一,那么你完全正確?,F(xiàn)在你可能會(huì)問(wèn):“隱藏和覆蓋有什么區(qū)別”?你也許還未理解這點(diǎn),然而實(shí)際上我們剛剛在這個(gè)Super/Sub 類(lèi)的例子中已經(jīng)解釋了兩者的不同。使用類(lèi)的全局名可以訪問(wèn)被隱藏的方法,即使變量s 是Sub 類(lèi)的一個(gè)實(shí)例,而且Sub 類(lèi)的greeting()方法隱藏了Super 類(lèi)的同名方法,我們?nèi)耘f能夠?qū) 強(qiáng)制轉(zhuǎn)換為Super 型以便訪問(wèn)被隱藏的greeting()方法。與被隱藏的方法不同,對(duì)被覆蓋的方法而言,除了覆蓋它們的類(lèi)之外其他任何類(lèi)都無(wú)法訪問(wèn)它們,這就是為何變量s 調(diào)用的是Sub 類(lèi)的而非Super 類(lèi)的name()方法。
  本單元簡(jiǎn)要解釋了Java 語(yǔ)言中一個(gè)不時(shí)引起混淆的問(wèn)題,也許對(duì)你來(lái)說(shuō)理解隱藏靜態(tài)方法和覆蓋實(shí)例方法的區(qū)別的最佳方式就是自己創(chuàng)建幾個(gè)類(lèi)似于Sub/Super 的類(lèi)再重復(fù)一次規(guī)則“實(shí)例方法被覆蓋而靜態(tài)方法被隱藏”,被覆蓋的方法只有覆蓋它們的類(lèi)才能訪問(wèn)它們,而訪問(wèn)被隱藏的方法的途徑是提供該方法的全局名。
  現(xiàn)在你終于明白標(biāo)題里問(wèn)題的答案了吧?什么時(shí)候“被覆蓋的”方法并非真地被覆蓋了呢?答案就是“永遠(yuǎn)不會(huì)”。另外,還有幾點(diǎn)要注意:

1. 試圖用子類(lèi)的靜態(tài)方法隱藏父類(lèi)中同樣標(biāo)識(shí)的實(shí)例方法是不合法的,編譯器將會(huì)報(bào)
錯(cuò);
2. 試圖用子類(lèi)的實(shí)例方法覆蓋父類(lèi)中同樣標(biāo)識(shí)的靜態(tài)方法也是不合法的,編譯器同樣
會(huì)報(bào)錯(cuò);
3. 靜態(tài)方法和最終方法(帶關(guān)鍵字final 的方法)不能被覆蓋;
4. 實(shí)例方法能夠被覆蓋;
5. 抽象方法必須在具體類(lèi)中被覆蓋

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多