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

談談Java中的繼承與組合

2013-11-23 19:18:42  來源: Java核心技術 

  繼承和組合的概念

  在新類裡簡單地創建原有類的對象我們把這種方法叫作組合因為新類由現有類的對象合並而成我們只是簡單地重復利用代碼的功能而不是采用它的形式

  第二種方法是創建一個新類將其作為現有類的一個類型我們可以原樣采取現有類的形式並在其中加入新代碼同時不會對現有的類產生影響這種魔術般的行為叫作繼承(Inheritance)涉及的大多數工作都是由編譯器完成的對於面向對象的程序設計繼承是最重要的基礎概念之一對於組合和繼承這兩種方法大多數語法和行為都是類似的(因為它們都要根據現有的類型生成新類型)

  組合也就是一個類的對象是另外一個類的成員一般的程序都有組合的意味只不過是基本數據類型是成員變量下面請看具體的例子

  class Head

  {

  Head(){

  Systemoutprintln( head );

  }

  }

  class Body

  {

  Body(){

  Systemoutprintln( body );

  }

  }

  class Person()

  {

  Head h=null;

  Body b=null;

  Person()                                //人是由頭和身體組成的Head和Body的對象是Person的一部分

  {

  h=new Head();

  b =new Body();

  }

  }

  繼承作為面向對象的三個重要特性的一個方面在面向對象的領域有著及其重要的作用好像沒聽說哪個面向對象的語言不支持繼承

  class Person

  {

  private String name=null;

  private int age=;

  public Person(String nint a)

  {

  name=n;

  age=a;

  }

  int getAge()

  {

  return age;

  }

  String getName()

  {

  return name;

  }

  void getDescription()

  {

  Systemoutprintln(name: +name+\t+age: +age);

  }

  }

  class Student extends Person

  {

  private String studno=null;

  public Student(String nString noint a)

  {

  super(na);

  studno=no;

  }

  }

  說明:Student類中有三個成員變量nameagestudno和一個方法getDescription();

  注意:子類繼承了父類的所有變量和函數只是子類不能訪問父類的private類型的變量和函數其實privae類型的變量還是繼承到子類中的

  

  無論還是繼承都允許我們將子對象置於自己的新類中大家或許會奇怪兩者間的差異以及到底該如何選擇

  如果想利用新類內部一個現有類的特性而不想使用它的接口通常應選擇組合也就是說我們可嵌入一個對象使自己能用它實現新類的特性但新類的用戶會看到我們已定義的接口而不是來自嵌入對象的接口考慮到這種效果我們需在新類裡嵌入現有類的private對象

  有些時候我們想讓類用戶直接訪問新類的組合也就是說需要將成員對象的屬性變為public成員對象會將自身隱藏起來所以這是一種安全的做法而且在用戶知道我們准備合成一系列組件時接口就更容易理解car(汽車)對象便是一個很好的例子

  class Engine {

  public void start() {}

  public void rev() {}

  public void stop() {}

  }

  class Wheel {

  public void inflate(int psi) {}

  }

  class Window {

  public void rollup() {}

  public void rolldown() {}

  }

  class Door {

  public Window window = new Window();

  public void open() {}

  public void close() {}

  }

  public class Car {

  public Engine engine = new Engine();

  public Wheel[] wheel = new Wheel[];

  public Door left = new Door()

  right = new Door(); // door

  Car() {

  for(int i = ; i < ; i++)

  wheel[i] = new Wheel();

  }

  public static void main(String[] args) {

  Car car = new Car();

  carleftwindowrollup();

  carwheel[]inflate();

  }

  } ///:~

  由於汽車的裝配是故障分析時需要考慮的一項因素(並非只是基礎設計簡單的一部分)所以有助於客戶程序員理解如何使用類而且類創建者的編程復雜程度也會大幅度降低

  如選擇繼承就需要取得一個現成的類並制作它的一個特殊版本通常這意味著我們准備使用一個常規用途的類並根據特定的需求對其進行定制只需稍加想象就知道自己不能用一個車輛對象來組合一輛汽車——汽車並不包含車輛相反屬於車輛的一種類別屬於關系是用繼承來表達的包含關系是用組合來表達的

   protected

  現在我們已理解了繼承的概念protected這個關鍵字最後終於有了意義在理想情況下private成員隨時都是私有任何人不得訪問但在實際應用中經常想把某些東西深深地藏起來但同時允許訪問衍生類的成員protected關鍵字可幫助我們做到這一點它的意思是它本身是私有的但可由從這個類繼承的任何東西或者同一個包內的其他任何東西訪問也就是說Java中的protected會成為進入友好狀態

  我們采取的最好的做法是保持成員的private狀態——無論如何都應保留對基 礎的實施細節進行修改的權利在這一前提下可通過protected方法允許類的繼承者進行受到控制的訪問

  import javautil*;

  class Villain {

  private int i;

  protected int read() { return i; }

  protected void set(int ii) { i = ii; }

  public Villain(int ii) { i = ii; }

  public int value(int m) { return m*i; }

  }

  public class Orc extends Villain {

  private int j;

  public Orc(int jj) { super(jj); j = jj; }

  public void change(int x) { set(x); }

  } ///:~

  可以看到change()擁有對set()的訪問權限因為它的屬性是protected(受到保護的)

   再論合成與繼承

  在面向對象的程序設計中創建和使用代碼最可能采取的一種做法是將數據和方法統一封裝到一個類裡並且使用那個類的對象有些時候需通過組合技術用現成的類來構造新類而繼承是最少見的一種做法因此盡管繼承在學習OOP的過程中得到了大量的強調但並不意味著應該盡可能地到處使用它相反使用它時要特別慎重只有在清楚知道繼承在所有方法中最有效的前提下才可考慮它為判斷自己到底應該選用組合還是繼承一個最簡單的辦法就是考慮是否需要從新類上溯造型回基礎類若必須上溯就需要繼承但如果不需要上溯造型就應提醒自己防止繼承的濫用但只要記住經常問自己


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26635.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.