一抽象類
抽象類(abstractclass):在類中聲明一個方法,這個方法沒有實現體,是一個“空”方法。這樣的類稱為抽象類,在類頭用abstract修飾符表示。
抽象方法(abstract method):只有方法聲明,而沒有具體方法體的方法。這樣的方法稱為抽象方法。在方法頭用abstract修飾符表示。
下面以GeometricObject類說明:
public abstract class GeometricObject { //Data fields, constructors, and partial methods omitted here
/** Abstract method getArea */
public abstract double getAreaO; /** Abstract method getPerimeter */
public abstract double getPerimeter(); } public class Circle extends CeometricObject { // omitted
} public class Rectangle extends CeometricObject { // omitted
}
GeometricObject類定義成 Circle 類和 Rectangle 類的父類。GeometricObject 類模擬了幾何對象的共同特征。Circle 類和 Rectangle 類分別包含計算圓和矩形的面積和周長的方法 getArea()和 getPerimeter()。因為可以計算所有幾何對象的面積和周長,所以最好在 GeometricObject類中定義 getArea ()和 getPerimeter() 方法。但是,這些方法不能在 GeometricObject類中實現,因為它們的實現取決於幾何對象的具體類型。所以把GeometricObject類定義成抽象類, getArea()和 getPerimeter()定義成抽象方法。
注:1.抽象類不能用new操作符創建它的實例,除此之外和常規類一樣。
2.包含抽象方法的類一定是抽象類,而抽象類不一定有抽象方法。
3.子類的父類是具體的,子類也可以是抽象的。
4.抽象方法必須是非靜態的。
二接口
1.接口:指明相關或者不相關類的多個對象的 共同行為。例如,使用正確的接口,可以指明這些對象是可比較的、可食用的,以及可克隆的。 例如,Java 的Comparable 接口采用下面的語法來定義接口:
// Interface for comparing objects, defined in java.lang package java.lang;
public interface Comparab1e<E> {
public int compareTo(E o) ;
}
compareTo 方法判斷這個對象相對於給定對象o的順序,並且當這個對象小於、等於或 大於給定對象 o時,分別返回負整數、0或正整數。
2.接口繼承:類和接口之間的關系稱為接口繼承,使用implements關鍵字完成。例如:
abstract class Fruit inplements Edible { //Data fields, constructors, and methods omitted here }
使用 Edible 接口來明確一個對象是否是可食用的,Fruit 類實現了 Edible 接口以表明水果是可食用的。
三接口與抽象類
1.定義
接口的使用和抽象類的使用基本相似。定義一個接口與抽象類有所不同,如下表:
2.擴展
Java 只允許為類的擴展做單一繼承,但是允許使用接口做多重擴展。例如,
public class NewClass extends Basedass implements Interface1,… ,InterfaceN {
…
}
3.使用
接口和抽象類都可以用於為對象指定共同的行為。
采用類來建模:比較強的 is-a(是一種)關系清晰地描述了父子關系,應該采用類來建模。例如,因為 桔子是一種水果,它們的關系就應該采用類的繼承關系來建模。圓或者矩形是 一個幾何對象,因此 Circle 可以設計為 CeometricObject 的子類。
使用接口建模:弱的 is-a關系,也稱為 iskind-of(是一類)關系,表明一個對象擁有某種屬性。弱的 is-a 關系可以使用接口建模。例如,所有的字符串都是可以比較的,因此 String 類實現了 Comparable 接口。圓有不同的半徑,並且可以基於半徑進行比較,因此 Circle 可以實現 Comparable 接口。
接口比抽象類更加靈活,因為一個子類只能繼承一個父類,但是卻可以實現任意個數的接口。