熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

多形性的覆蓋與過載

2013-11-15 11:34:35  來源: JSP教程 

  現在讓我們用不同的眼光來看看本章的頭一個例子在下面這個程序中方法play()的接口會在被覆蓋的過程中發生變化這意味著我們實際並沒有覆蓋方法而是使其過載編譯器允許我們對方法進行過載處理使其不報告出錯但這種行為可能並不是我們所希望的下面是這個例子
  
  //: WindErrorjava
  // Accidentally changing the interface
  
  class NoteX {
   public static final int
    MIDDLE_C = C_SHARP = C_FLAT = ;
  }
  
  class InstrumentX {
   public void play(int NoteX) {
    Systemoutprintln(InstrumentXplay());
   }
  }
  
  class WindX extends InstrumentX {
   // OOPS! Changes the method interface:
   public void play(NoteX n) {
    Systemoutprintln(WindXplay(NoteX n));
   }
  }
  
  public class WindError {
   public static void tune(InstrumentX i) {
    //
    iplay(NoteXMIDDLE_C);
   }
   public static void main(String[] args) {
    WindX flute = new WindX();
    tune(flute); // Not the desired behavior!
   }
  } ///:~
  
  這裡還向大家引入了另一個易於混淆的概念在InstrumentX中play()方法采用了一個int(整數)數值它的標識符是NoteX也就是說即使NoteX是一個類名也可以把它作為一個標識符使用編譯器不會報告出錯但在WindX中play()采用一個NoteX句柄它有一個標識符n即便我們使用play(NoteX NoteX)編譯器也不會報告錯誤這樣一來看起來就象是程序員有意覆蓋play()的功能但對方法的類型定義卻稍微有些不確切然而編譯器此時假定的是程序員有意進行過載而非覆蓋請仔細體會這兩個術語的區別過載是指同一樣東西在不同的地方具有多種含義覆蓋是指它隨時隨地都只有一種含義只是原先的含義完全被後來的含義取代了請注意如果遵守標准的Java命名規范自變量標識符就應該是noteX這樣可把它與類名區分開
  
  在tune中InstrumentX i會發出play()消息同時將某個NoteX成員作為自變量使用(MIDDLE_C)由於NoteX包含了int定義過載的play()方法的int版本會得到調用同時由於它尚未被覆蓋所以會使用基礎類版本
  
  輸出是
  
  InstrumentXplay()
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19231.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.