抽象類
在繼承的層次結構中,每個新子類都使類變得越來越明確和具體,如果從一個子類追溯到父類,類就會變得更通用、更加不明確,類的設計應該確保父類包含它的子類的共同特征,但有時候,一個父類設計得非常抽象,以至于它都沒有任何具體的實體,這樣的類稱為抽象類(abstract class),
簡而言之,抽象類就是在一個父類中只進行定義而不進行實體化應用的一個型別,其實體化取決于物件的型別,例如在GeometricObject類中定義getArea()和 getPerimeter(),但這兩種方法的應用取決于物件的型別(三角形,矩形……)
如圖所示的案例:

getArea(),getPerimeter()都是父類抽象類GeometricObject的抽象方法,在Runner類中僅僅只是定義,它們的實體化就需要取決于子類的型別,并且在子類中呼叫,
抽象類和常規類很像,但是不能使用 new 運算子創建它的實體,抽象方法只有定義而沒有實作,它的實作由子類提供,一個包含抽象方法的類必須宣告為抽象類,
抽象類的構造方法定義為 Protected, 因為它只被子類使用,創建一個具體子類的實體時,它的父類的構造方法被呼叫以初始化父類中定義的資料域,
抽象類 GeometricObject 為幾何物件定義了共同特征(資料和方法 ),并且提供了合適的構造方法,
使用抽象類可以實作根據子類物件型別而且決定呼叫哪一種方法,
- 抽象方法不能包含在非抽象類中,如果抽象父類的子類不能實作所有的抽象方法,那么子類也必須定義為抽象的,換句話說,在抽象類擴展的非抽象子類中,必須實作所有的抽象方法,還要注意到,抽象方法是非靜態的,
- 抽象類是不能使用 new 運算子來初始化的,但是,仍然可以定義它的構造方法,這個構造方法在它的子類的構造方法中呼叫,例如,CeometricObject 類的構造方法在Circle 類和 Recfange 類中呼叫,
- 包含抽象方法的類必須是抽象的,但是,可以定義一個不包含抽象方法的抽象類,在這種情況下,不能使用 new 運算子創建該類的實體,這種類是用來定義新子類的基類的,
- 子類可以覆寫父類的方法并將它定義為 abstract,這是很少見的,但是它在當父類的方法實作在子類中變得無效時是很有用的,在這種情況下,子類必須定義為abstract,
- 即使子類的父類是具體的,這個子類也可以是抽象的,例如,Object 類是具體的,但是它的子類如 CeometricObject 可以是抽象的,
介面
在 Java 中,介面被看作是一種特殊的類,使用interface關鍵字定義介面,就像常規類一樣,每個介面都被編譯為獨立的位元組碼檔案,使用介面或多或少有點像使用抽象類,例如,可以使用介面作為參考變M的資料型別或型別轉換的結果等,與抽象類相似,不能使用 new 運算子創建介面的實體,
可以使用 Edible 介面來明確一個物件是否是可食用的,類與介面的連接需要使用implements來連接,類和介面之間的關系稱為介面繼承,因為介面繼承和類繼承本質上是相同的,所以我們將它們都簡稱為繼承,
簡而言之,介面一個抽象方法和變數名的一個定義集合,
例:compareble類
Comparable 介面定義了 compareTo 方法,用于比較物件,
假設要設計一個求兩個相同型別物件中較大者的通用方法,這里的物件可以是兩個學生、兩個日期、兩個圓、 兩個矩形或者兩個正方形,為了實作這個方法,這兩個物件必須是可比較的,因此,這兩個物件都該有的共同方法就是 comparable (可比較的),為此,Java提供了 Comparable 介面,
被比較的雙方都應該繼承Compara介面,并且通過compareTo方法實作比較,
compareTo 方法判斷這個物件相對于給定物件 o 的順序,并且當這個物件小于、等于或大于給定物件 o 時,分別回傳負整數、0或正整數,
介面與抽象類

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/388255.html
標籤:其他
