??? 雖然接觸Java已經快一年了,也系統的學過Java語法,不過很多概念到現在都搞不清楚,現在決定重新把這些模糊的概念重新溫習一遍,今天就現總結一下抽象類(abstract class)。
1、使用abstract類的動機:可以參考 Cay?S.?Horstmann, Gary?Cornel 寫的書《Core Java? 2 Volume I - Fundamentals, Seventh Edition 》(順便羅嗦一下,該書是偶見過最好的Java入門書) “Classes, Superclasses, and Subclasses ”一節,定義一個abstract class的格式是:修飾符(public, private, etc)+abstract+類名 或者 abstract + 修飾符 + 類名。
2、如果一個類至少存在一個抽象方法(abstract method),則它自身必須聲明成一個抽象類。但一個類可以被聲明成一個抽象類即使它沒有任何抽象方法。聲明一個abstract method的格式是:修飾符(public, private, etc)+abstract+返回類型 + 方法名 或者 abstract + 修飾符 + 返回類型 + 方法名。
3、一個抽象類可以有數據域和非抽象方法(concrete data and concrete methods)。
4、當一個子類繼承某個抽象類時,它可以有兩個選擇:
??? (1)??? 部分實現或完全不實現父類的所有抽象方法,但此時子類必須聲明為抽象類。
??? (2)??? 實現父類所有的抽象方法,此時之類不比聲明為抽象類。
5、抽象類不能被實例化(be instantiated),但可以實例化非抽象子類(concrete subclass)。
?? 可以聲明抽象類變量,但該變量必須指向一個非抽象子類.看下面一個例子:
6、摘自《Core Java 2》的一個例子:
PersonTest.java
參考資料:
1、使用abstract類的動機:可以參考 Cay?S.?Horstmann, Gary?Cornel 寫的書《Core Java? 2 Volume I - Fundamentals, Seventh Edition 》(順便羅嗦一下,該書是偶見過最好的Java入門書) “Classes, Superclasses, and Subclasses ”一節,定義一個abstract class的格式是:修飾符(public, private, etc)+abstract+類名 或者 abstract + 修飾符 + 類名。
2、如果一個類至少存在一個抽象方法(abstract method),則它自身必須聲明成一個抽象類。但一個類可以被聲明成一個抽象類即使它沒有任何抽象方法。聲明一個abstract method的格式是:修飾符(public, private, etc)+abstract+返回類型 + 方法名 或者 abstract + 修飾符 + 返回類型 + 方法名。
3、一個抽象類可以有數據域和非抽象方法(concrete data and concrete methods)。
4、當一個子類繼承某個抽象類時,它可以有兩個選擇:
??? (1)??? 部分實現或完全不實現父類的所有抽象方法,但此時子類必須聲明為抽象類。
??? (2)??? 實現父類所有的抽象方法,此時之類不比聲明為抽象類。
5、抽象類不能被實例化(be instantiated),但可以實例化非抽象子類(concrete subclass)。
?? 可以聲明抽象類變量,但該變量必須指向一個非抽象子類.看下面一個例子:
???1.??Person?[]?people?=?new?Person[2];????
???2.?people[0]?=?new?Employee(
);????
???3.?people[1]?=?new?Student(
);??
???4.?for?(Person?p?:?people)??
???5.????System.out.println(p.getName()?+?","?+?p.getDescription());??
注意代碼中的一個調用:p.getDescription().可能有人會擔心這里調用了一個沒定義的方法。但是, 由于不能構造抽象類Person的對象,所以p永遠不會調動Person對象,而是只會調用諸如Employee或Student這樣的具體子類方法。注意,如果沒有定義Person中抽象方法getDescription()但是通過p調用getDescription()則會產生編譯錯誤,編譯器只允許調用在類中聲明的方法。???2.?people[0]?=?new?Employee(

???3.?people[1]?=?new?Student(

???4.?for?(Person?p?:?people)??
???5.????System.out.println(p.getName()?+?","?+?p.getDescription());??
6、摘自《Core Java 2》的一個例子:

參考資料:
Core Java 2 Volume I - Fundamentals, Seventh Edition
by Cay S. Horstman, Gary Cornell