導語:
- 接口和內部類爲我們提供了一種將接口和實現分離的更加結構化的方法。
- Java關鍵字這個事實表明人們認爲這些思想很重要,以至於要提供對它們的直接支持。
1.抽象類
- 第八章中的Instrument樂器類中直接調用其方法會出錯。因爲Instrument的目的是爲實現它的子類提供一個通用的接口。
目的是不同的子類以不同的方式實現此接口。 - 通用接口建立起一種基本形式,表示所有子類的共同部分。另一種說法是將Instrument類稱作抽象基類,簡稱抽象類。
- 抽象類的作用:通過抽象類創建的對象幾乎沒有意義,只是希望通過抽象類這個抽象接口引用操縱一系列類(多態)。
- 注意:1.調用所有抽象類中的方法編譯器都會報錯。
2.如果一個類包含抽象方法,那麼它必須被聲明爲抽象類 關鍵字abstract。
3.如果創建抽象類的對象時,編譯器會報錯,編譯器會確保抽象類的純粹性。 - 創建使用抽象類:繼承一個抽象類,必須實現其中所有的抽象方法。如果不這樣做,那麼導出類也是抽象類,並且編譯器將會強制用abstract關鍵字來限定這個類。
- 抽象類的優點:抽象類可以使類的抽象性明確起來,並告訴用戶和編譯器打算怎樣來使用它們,抽象類是很有用的重構工具,使我們可以很容易的將公共方法沿繼承層次結構向上移動。
- 代碼提供:
abstract class Instrument { abstract void play(String n); // 非抽象方法 private String what() {return "Instrument";} abstract void adjust(); } class Wind extends Instrument { void play(String n) {System.out.println("Wind" + n);} void adjust() {} } // 沒實現完抽象父類中的方法 abstract class Percussion extends Instrument { // 實現其中的一個 void play(String n) { System.out.println("Percussion" + n); } // 沒實現這個方法,雖然這個adjust和父類Instrument中的一樣,但這個方法是Percussion的抽象方法 abstract void adjust(); // 這個抽象類還可以定義其他抽象的方法 abstract void next(); } class Brass extends Wind { } public class Music { public static void main(String[] args) { // 聲明一個Instrument,這樣會報錯 // Instrument instrument = new Instrument(); // 不過可以這樣 Instrument inside = new Instrument() { void play(String n) { System.out.println("內部定義:" + n); } void adjust() { } }; // 調用 Instrument[] orchestra = { inside, new Wind(), new Brass() // 因爲這個是個空類,沒有重寫父類方法,他就只能執行父類中的方法了。 }; for (Instrument i : orchestra) { i.play("呵呵:"); } } }
2.接口
- 接口關鍵字使抽象的概念更向前邁了一步
- interface關鍵字產生了一個完全抽象的類,其中的方法聲明沒有任何具體的實現,僅僅是聲明而已,抽象類可以有部分方法實現。
- 一個接口表示:“所有實現了該特定接口的類看起來都像這樣”。
- java是單一繼承的,而接口的產生就可以實現多重繼承了,可以向上轉型(子類有父類的引用)爲多種父類的類型。
- 接口中的域(字段等)都隱式的聲明爲static和final的,並且是public的。接口中的方法也都必須是public的,否則編譯器會報錯。
- 實現接口,需要使用implements關鍵字,表示“interface”只是它的表象。
- 代碼:
interface Instrument{ int i = 0;//接口中的域 static&final void play (String n); public void adjust(); } //接口也可以繼承接口而不必實現其中的方法,但不能使用implements關鍵字 interface Insturment2 extends Instrument{ //但父接口(Instrument)的方法並沒有被重寫,雖然是一樣的,這個play僅屬於Insturment2 public void play(String n); } class Wind implements Instrument{ public void play(String n) {System.out.println("Wind" + n);} public void adjust() {} } class Percussion implements Instrument{ public void play(String n) {System.out.println("Percussion" + n);} public void adjust() {} } public class Music { public static void main(String[] args) { Instrument instrument = new Instrument() { public void play(String n) {System.out.println("內部實現:" + n);} public void adjust() {} }; Instrument[] orchestra = { new Wind(),new Percussion(),instrument }; // Instrument.i ++;//因爲是final的這樣是錯誤的調用,因爲是靜態、public,可以Instrument.i } }