java抽象類

java抽象類

使用了關鍵字abstract聲明的類叫作“抽象類”。如果一個類里包含了一個或多個抽象方法,類就必須指定成abstract(抽象)。“抽象方法”,屬於一種不完整的方法,只含有一個聲明,沒有方法主體。

抽象語法

下面是抽象方法聲明時採用的語法:

abstract void f();

如果從一個抽象類繼承,而且想生成新類型的一個對象,就必須為基礎類中的所有抽象方法提供方法定義。

如果不這樣做(完全可以選擇不做),則衍生類也會是抽象的,而且編譯器會強迫我們用abstract 關鍵字標誌那個類的“抽象”本質。

即使不包括任何abstract 方法,亦可將一個類聲明成“抽象類”。如果一個類沒必要擁有任何抽象方法,而且我們想禁止那個類的所有實例,這種能力就會顯得非常有用。

在面向對象的概念中,我們知道所有的對象都是通過類來描繪的,但是反過來卻不是這樣。並不是所有的類都是用來描繪對象的,如果一個類中沒有包含足夠的信息來描繪一個具體的對象,這樣的類就是抽象類。抽象類往往用來表征我們在對問題領域進行分析、設計中得出的抽象概念,是對一系列看上去不同,但是本質上相同的具體概念的抽象。比如:如果我們進行一個圖形編輯軟體的開發,就會發現問題領域存在著圓、三角形這樣一些具體概念,它們是不同的,但是它們又都屬於形狀這樣一個概念,形狀這個概念在問題領域是不存在的,它就是一個抽象概念。正是因為抽象的概念在問題領域沒有對應的具體概念,所以用以表征抽象概念的抽象類是不能夠實例化的。

在面向對象領域,抽象類主要用來進行類型隱藏。我們可以構造出一個固定的一組行為的抽象描述,但是這組行為卻能夠有任意個可能的具體實現方式。這個抽象描述就是抽象類,而這一組任意個可能的具體實現則表現為所有可能的派生類。模組可以操作一個抽象體。由於模組依賴於一個固定的抽象體,因此它可以是不允許修改的;同時,通過從這個抽象體派生,也可擴展此模組的行為功能。熟悉OCP的讀者一定知道,為了能夠實現面向對象設計的一個最核心的原則OCP(Open-Closed Principle),抽象類是其中的關鍵所在。

對比接口

語法定義層

在abstract class方式中,Demo可以有自己的數據成員,也可以有非abstract的成員方法,而在interface方式的實現中,Demo只能夠有靜態的不能被修改的數據成員(也就是必須是static final的,不過在interface中一般不定義數據成員),所有的成員方法都是abstract的。

編程層面

abstract class在Java語言中表示的是一種繼承關係,一個類只能使用一次繼承關係。但是,一個類卻可以實現多個interface。

設計理念層面

abstract class在Java語言中體現了一種繼承關係,要想使得繼承關係合理,父類和派生類之間必須存在"is a"關係,即父類和派生類在概念本質上應該是相同的。 對於interface 來說則不然,並不要求interface的實現者和interface定義在概念本質上是一致的,僅僅是實現了interface定義的契約(功能)而已。

抽象類函式 抽象類函式

四、抽象類的示例代碼

//: interfaces/music4/Music4.java

// Abstract classes and methods.

/* 抽象類的功能

* 使類的抽象性明確起來

*

*/

// 以下是 抽象類 的示例

package interfaces.music4;

import pets.Pet;

import polymorphism.music.Note;

import static net.mindview.util.Print.*;

/* 1. 抽象方法 abstract void f(); 抽象方法不能包含有任何方法的BODY 。

* 2. 如果一個類包含1個或者多個抽象方法, 則該類必須限定為抽象的。

* 需要在前面指定 abstract 關鍵字。

* (1)抽象類不能被實例化

* (2)包含抽象方法的類,必須標識 abstract

* 3. 如果從一個抽象類繼承, 必須對所有抽象方法進行覆蓋 , 否則導出類也是抽象的

* 4. 也可以考慮創建沒有任何抽象方法的抽象類 。

*

*/

abstract class Instrument {

// 抽象類中可以有非抽象方法。

private int i; // Storage allocated for each

public abstract void play(Note n);

public String what() { return "Instrument"; }

public abstract void adjust();

}

/*

(2)包含抽象方法的類,必須標識 abstract, 否則編譯器會報錯

class abc

{

public abstract void Demo();

}*/

class Wind extends Instrument {

public void play(Note n) {

print("Wind.play() " + n);

}

public String what() { return "Wind"; }

public void adjust() {}

}

class Percussion extends Instrument {

public void play(Note n) {

print("Percussion.play() " + n);

}

public String what() { return "Percussion"; }

public void adjust() {}

}

class Stringed extends Instrument {

public void play(Note n) {

print("Stringed.play() " + n);

}

public String what() { return "Stringed"; }

public void adjust() {}

}

class Brass extends Wind {

public void play(Note n) {

print("Brass.play() " + n);

}

public void adjust() { print("Brass.adjust()"); }

}

class Woodwind extends Wind {

public void play(Note n) {

print("Woodwind.play() " + n);

}

public String what() { return "Woodwind"; }

}

class TestAbsExt extends Instrument

{

public void play( Note n ) {

print ("TestAbsExt.play()" + n);

}

public String what()

{

return "TestAbsExt";

}

public void adjust()

{

}

}

// 不含任何抽象方法的抽象類

abstract class AbsClass

{

public void f1() {

print("f1()");

}

public void f2() {

print("f2()");

}

}

public class Music4 {

// Doesn't care about type, so new types

// added to the system still work right:

static void tune(Instrument i) {

// ...

i.play(Note.MIDDLE_C);

}

static void tuneAll(Instrument[] e) {

for(Instrument i : e)

tune(i);

}

public static void main(String[] args) {

// !抽象類不能被實例化

// 若使用以下語句 , 將會收到報錯。

/* Exception in thread "main" java.lang.Error: Unresolved compilation problem:

Instructment cannot be resolved to a type

*/

// ! new Instructment();

// Upcasting during addition to the array:

Instrument[] orchestra = {

new Wind(),

new Percussion(),

new Stringed(),

new Brass(),

new Woodwind()

};

tuneAll(orchestra);

}

} /* Output:

Wind.play() MIDDLE_C

Percussion.play() MIDDLE_C

Stringed.play() MIDDLE_C

Brass.play() MIDDLE_C

Woodwind.play() MIDDLE_C

*///:~

/*

* 抽象方法不能包含有任何方法的BODY 。

*/

/*

abstract class RodentAbs extends Pet {

abstract public Rodent(String name) { super(name); }

abstract public Rodent() { super(); }

} ///:~

*/

相關詞條

相關搜尋

熱門詞條

聯絡我們