1. 程式人生 > >7-JavaSE之面向物件程式設計-抽象類與接 口

7-JavaSE之面向物件程式設計-抽象類與接 口

本節目標:

  1. 抽象類的定義與使用
  2. 模板設計模式
  3. 介面的定義與使用
  4. 工廠設計模式
  5. 代理設計模式
  6. 抽象類與介面的區別

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對於抽象類的使用原則:

  1. 所有的抽象類必須有子類(abstract與final不能同時使用 — final修飾的類不能繼承)。
  2. 抽象類的子類必須覆寫抽象類的所有抽象方法(子類不是抽象類,private與abstract不能同時使用。) 【方法覆寫一定要考慮許可權問題,權限盡量都用public】
  3. 抽象類要想建立例項化物件,必須通過子類向上轉型為其例項化。(抽象類無法直接建立例項化物件 — 父類使用子類的物件) 範例:使用抽象類
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抽象類的相關規定

  1. 在抽象類中也允許提供構造方法,並且子類也照樣遵循物件例項化流程。 先呼叫父類構造方法再呼叫子類構造方法(例項化子類 – new)

  2. 抽象類中允許不定義任何的抽象方法,但是此時抽象類依然無法直接建立例項化物件。

  3. 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模板設計模式 — 基於抽象類,核心是封裝演算法 模板方法定義了一個演算法的步驟,並允許子類為一個或多個步驟提供具體實現。

模板(模板方法)模式: 在一個方法中定義一個演算法的骨架,並將一些具體步驟延遲到子類中實現。 模板模式使得子類可以在不改變演算法結構的基礎上,重新具體定義演算法中的某些步驟。

3. 介面的定義與使用

4. 工廠設計模式

5. 代理設計模式

6. 抽象類與介面的區別