7-JavaSE之面向物件程式設計-抽象類與接 口
阿新 • • 發佈:2018-12-16
本節目標:
- 抽象類的定義與使用
- 模板設計模式
- 介面的定義與使用
- 工廠設計模式
- 代理設計模式
- 抽象類與介面的區別
1.抽象類的定義與使用
1.1 抽象類的定義與使用(abstract) 1>定義:抽象類只是在普通類的基礎上擴充了一些抽象方法而已。所謂的抽象方法指的是隻宣告而未實現的方法(即沒有方法體)。 所有抽象方法要求使用abstract關鍵字來定義,並且抽象方法所在的類也一定要使用abstract關鍵字來定義,表示抽象類。 範例:定義一個抽象類
abstract class Person{ private String name ; // 屬性 public String getName(){ // 普通方法 return this.name; } public void setName(String name){ this.name = name ; } // {}為方法體,所有抽象方法上不包含方法體 public abstract void getPersonInfo() ; //抽象方法 }
1.2對於抽象類的使用原則:
- 所有的抽象類必須有子類(abstract與final不能同時使用 — final修飾的類不能繼承)。
- 抽象類的子類必須覆寫抽象類的所有抽象方法(子類不是抽象類,private與abstract不能同時使用。) 【方法覆寫一定要考慮許可權問題,權限盡量都用public】
- 抽象類要想建立例項化物件,必須通過子類向上轉型為其例項化。(抽象類無法直接建立例項化物件 — 父類使用子類的物件) 範例:使用抽象類
abstract class Person{ private String name ; // 屬性 public String getName(){ // 普通方法 return this.name; } public void setName(String name){ this.name = name ; } // {}為方法體,所有抽象方法上不包含方法體 public abstract void getPersonInfo() ; //抽象方法 } class Student extends Person{ public void getPersonInfo(){ System.out.println("I am a student"); } } public class Test{ public static void main(String[] args) { Person per = new Student() ; //例項化子類,向上轉型 per.getPersonInfo() ; //被子類所覆寫的方法 此處註釋1 } } 註釋1:父類使用子類的物件,同時子類覆寫父類的方法, 所以此時相當於父類物件呼叫父類的方法。
1.3抽象類的相關規定
-
在抽象類中也允許提供構造方法,並且子類也照樣遵循物件例項化流程。 先呼叫父類構造方法再呼叫子類構造方法(例項化子類 – new)
-
抽象類中允許不定義任何的抽象方法,但是此時抽象類依然無法直接建立例項化物件。
-
abstract與final不能一起用; abstract與private也不能一起用。
注意觀察此範例的呼叫順序(重要):
abstract class A{ public A(){ //3.呼叫父類構造 this.print() ; //4.呼叫被子類覆寫的方法 } public abstract void print() ; //此方法為抽象方法,不能被呼叫 -- 所以到子類中呼叫子類覆寫的父類抽象方法 } class B extends A{ private int num = 100 ; public B(int num) { //2.呼叫子類例項化物件 -- 子類的構造方法 super() ; //3.隱含一行語句,實際要先呼叫父類構造 this.num = num ; // } public void print() { //5.此時子類物件的屬性還沒有被初始化 7. System.out.println(this.num) ; //6.對應其資料型別的預設值 --- 結果為0(指的是父類的輸出) } } public class test{ public static void main(String[] args) { new B(30) ; //1.例項化子類物件 若改為new B(30).print() -- 結果為0 30 // B(30)指子類的構造方法已經執行完畢,例項化了30. 從此處直接到子類的print 7 } }
1.4內部抽象類(瞭解) 如果內部類中出現了抽象方法,不用關心,只調用直接抽象方法。
2. 模板設計模式(封裝演算法)–抽象類的實際應用
2.1模板設計模式 — 基於抽象類,核心是封裝演算法 模板方法定義了一個演算法的步驟,並允許子類為一個或多個步驟提供具體實現。
模板(模板方法)模式: 在一個方法中定義一個演算法的骨架,並將一些具體步驟延遲到子類中實現。 模板模式使得子類可以在不改變演算法結構的基礎上,重新具體定義演算法中的某些步驟。