程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java類繼承的語法

java類繼承的語法

編輯:關於JAVA

繼承與Java(以及其他OOP語言)非常緊密地結合在一起。我們早在第1章就為大家引入了繼承的概念,並在那章之後到本章之前的各章裡不時用到,因為一些特殊的場合要求必須使用繼承。除此以外,創建一個類時肯定會進行繼承,因為若非如此,會從Java的標准根類Object中繼承。
用於合成的語法是非常簡單且直觀的。但為了進行繼承,必須采用一種全然不同的形式。需要繼承的時候,我們會說:“這個新類和那個舊類差不多。”為了在代碼裡表面這一觀念,需要給出類名。但在類主體的起始花括號之前,需要放置一個關鍵字extends,在後面跟隨“基礎類”的名字。若采取這種做法,就可自動獲得基礎類的所有數據成員以及方法。下面是一個例子:

 

//: Detergent.java
// Inheritance syntax & properties

class Cleanser {
  private String s = new String("Cleanser");
  public void append(String a) { s += a; }
  public void dilute() { append(" dilute()"); }
  public void apply() { append(" apply()"); }
  public void scrub() { append(" scrub()"); }
  public void print() { System.out.println(s); }
  public static void main(String[] args) {
    Cleanser x = new Cleanser();
    x.dilute(); x.apply(); x.scrub();
    x.print();
  }
}

public class Detergent extends Cleanser {
  // Change a method:
  public void scrub() {
    append(" Detergent.scrub()");
    super.scrub(); // Call base-class version
  }
  // Add methods to the interface:
  public void foam() { append(" foam()"); }
  // Test the new class:
  public static void main(String[] args) {
    Detergent x = new Detergent();
    x.dilute();
    x.apply();
    x.scrub();
    x.foam();
    x.print();
    System.out.println("Testing base class:");
    Cleanser.main(args);
  }
} ///:~

這個例子向大家展示了大量特性。首先,在Cleanser append()方法裡,字串同一個s連接起來。這是用“+=”運算符實現的。同“+”一樣,“+=”被Java用於對字串進行“過載”處理。
其次,無論Cleanser還是Detergent都包含了一個main()方法。我們可為自己的每個類都創建一個main()。通常建議大家象這樣進行編寫代碼,使自己的測試代碼能夠封裝到類內。即便在程序中含有數量眾多的類,但對於在命令行請求的public類,只有main()才會得到調用。所以在這種情況下,當我們使用“java Detergent”的時候,調用的是Degergent.main()——即使Cleanser並非一個public類。采用這種將main()置入每個類的做法,可方便地為每個類都進行單元測試。而且在完成測試以後,毋需將main()刪去;可把它保留下來,用於以後的測試。
在這裡,大家可看到Deteregent.main()對Cleanser.main()的調用是明確進行的。
需要著重強調的是Cleanser中的所有類都是public屬性。請記住,倘若省略所有訪問指示符,則成員默認為“友好的”。這樣一來,就只允許對包成員進行訪問。在這個包內,任何人都可使用那些沒有訪問指示符的方法。例如,Detergent將不會遇到任何麻煩。然而,假設來自另外某個包的類准備繼承Cleanser,它就只能訪問那些public成員。所以在計劃繼承的時候,一個比較好的規則是將所有字段都設為private,並將所有方法都設為public(protected成員也允許衍生出來的類訪問它;以後還會深入探討這一問題)。當然,在一些特殊的場合,我們仍然必須作出一些調整,但這並不是一個好的做法。
注意Cleanser在它的接口中含有一系列方法:append(),dilute(),apply(),scrub()以及print()。由於Detergent是從Cleanser衍生出來的(通過extends關鍵字),所以它會自動獲得接口內的所有這些方法——即使我們在Detergent裡並未看到對它們的明確定義。這樣一來,就可將繼承想象成“對接口的重復利用”或者“接口的再生”(以後的實施細節可以自由設置,但那並非我們強調的重點)。
正如在scrub()裡看到的那樣,可以獲得在基礎類裡定義的一個方法,並對其進行修改。在這種情況下,我們通常想在新版本裡調用來自基礎類的方法。但在scrub()裡,不可只是簡單地發出對scrub()的調用。那樣便造成了遞歸調用,我們不願看到這一情況。為解決這個問題,Java提供了一個super關鍵字,它引用當前類已從中繼承的一個“超類”(Superclass)。所以表達式super.scrub()調用的是方法scrub()的基礎類版本。
進行繼承時,我們並不限於只能使用基礎類的方法。亦可在衍生出來的類裡加入自己的新方法。這時采取的做法與在普通類裡添加其他任何方法是完全一樣的:只需簡單地定義它即可。extends關鍵字提醒我們准備將新方法加入基礎類的接口裡,對其進行“擴展”。foam()便是這種做法的一個產物。
在Detergent.main()裡,我們可看到對於Detergent對象,可調用Cleanser以及Detergent內所有可用的方法(如foam())。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved