熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

抽象類和方法

2013-11-23 19:00:38  來源: Java核心技術 

  在我們所有樂器(Instrument)例子中基礎類Instrument內的方法都肯定是方法若去調用這些方法就會出現錯誤那是由於Instrument的意圖是為從它衍生出去的所有類都創建一個通用接口
  
  之所以要建立這個通用接口唯一的原因就是它能為不同的子類型作出不同的表示它為我們建立了一種基本形式使我們能定義在所有衍生類裡通用的一些東西為闡述這個觀念另一個方法是把Instrument稱為抽象基礎類(簡稱抽象類若想通過該通用接口處理一系列類就需要創建一個抽象類對所有與基礎類聲明的簽名相符的衍生類方法都可以通過動態綁定機制進行調用(然而正如上一節指出的那樣如果方法名與基礎類相同但自變量或參數不同就會出現過載現象那或許並非我們所願意的)
  
  如果有一個象Instrument那樣的抽象類那個類的對象幾乎肯定沒有什麼意義換言之Instrument的作用僅僅是表達接口而不是表達一些具體的實施細節所以創建一個Instrument對象是沒有意義的而且我們通常都應禁止用戶那樣做為達到這個目的可令Instrument內的所有方法都顯示出錯消息但這樣做會延遲信息到運行期並要求在用戶那一面進行徹底可靠的測試無論如何最好的方法都是在編譯期間捕捉到問題
  
  針對這個問題Java專門提供了一種機制名為抽象方法它屬於一種不完整的方法只含有一個聲明沒有方法主體下面是抽象方法聲明時采用的語法
  
  abstract void X();
  
  包含了抽象方法的一個類叫作抽象類如果一個類裡包含了一個或多個抽象方法類就必須指定成abstract(抽象)否則編譯器會向我們報告一條出錯消息
  
  若一個抽象類是不完整的那麼一旦有人試圖生成那個類的一個對象編譯器又會采取什麼行動呢?由於不能安全地為一個抽象類創建屬於它的對象所以會從編譯器那裡獲得一條出錯提示通過這種方法編譯器可保證抽象類的純潔性我們不必擔心會誤用它
  
  如果從一個抽象類繼承而且想生成新類型的一個對象就必須為基礎類中的所有抽象方法提供方法定義如果不這樣做(完全可以選擇不做)則衍生類也會是抽象的而且編譯器會強迫我們用abstract關鍵字標志那個類的抽象本質
  
  即使不包括任何abstract方法亦可將一個類聲明成抽象類如果一個類沒必要擁有任何抽象方法而且我們想禁止那個類的所有實例這種能力就會顯得非常有用
  
  Instrument類可很輕松地轉換成一個抽象類只有其中一部分方法會變成抽象方法因為使一個類抽象以後並不會強迫我們將它的所有方法都同時變成抽象下面是它看起來的樣子
  

  下面是我們修改過的管弦樂器例子其中采用了抽象類以及方法
  
  //: Musicjava
  // Abstract classes and methods
  import javautil*;
  
  abstract class Instrument {
   int i; // storage allocated for each
   public abstract void play();
   public String what() {
  return Instrument;
   }
   public abstract void adjust();
  }
  
  class Wind extends Instrument {
   public void play() {
  Systemoutprintln(Windplay());
   }
   public String what() { return Wind; }
   public void adjust() {}
  }
  
  class Percussion extends Instrument {
   public void play() {
  Systemoutprintln(Percussionplay());
   }
   public String what() { return Percussion; }
   public void adjust() {}
  }
  
  class Stringed extends Instrument {
   public void play() {
  Systemoutprintln(Stringedplay());
   }
   public String what() { return Stringed; }
   public void adjust() {}
  }
  
  class Brass extends Wind {
   public void play() {
  Systemoutprintln(Brassplay());
   }
   public void adjust() {
  Systemoutprintln(Brassadjust());
   }
  }
  
  class Woodwind extends Wind {
   public void play() {
  Systemoutprintln(Woodwindplay());
   }
   public String what() { return Woodwind; }
  }
  
  public class Music {
   // Doesnt care about type so new types
   // added to the system still work right:
   static void tune(Instrument i) {
  //
  iplay();
   }
   static void tuneAll(Instrument[] e) {
  for(int i = ; i < e.length; i++)
   tune(e[i]);
   }
   public static void main(String[] args) {
  Instrument4[] orchestra = new Instrument4[5];
  int i = 0;
  // Upcasting during addition to the array:
  orchestra[i++] = new Wind4();
  orchestra[i++] = new Percussion4();
  orchestra[i++] = new Stringed4();
  orchestra[i++] = new Brass4();
  orchestra[i++] = new Woodwind4();
  tuneAll(orchestra);
   }
  } ///:~
  
  可以看出,除基礎類以外,實際並沒有進行什麼改變。tW.WinGWIt.cOm
  
  創建抽象類和方法有時對我們非常有用,因為它們使一個類的抽象變成明顯的事實,可明確告訴用戶和編譯器自己打算如何用它。
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26130.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.