1. 程式人生 > >單例模式、類的繼承和多型

單例模式、類的繼承和多型

一、單例模式

  單例模式是一種常用的軟體設計模式,在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中應用該模式的類,一個類只能有一個例項,即一個類只有一個物件例項。

  1. Java中單例模式定義:一個類有且僅有一個例項,並且自行例項化向整個系統提供。

  2. 構建方式:

  • 懶漢模式:指全域性的單例例項在第一次被使用時構建
class MySingleTon {
    private static MySingleTon singleTon = null;
    private MySingleTon() {
       //構造方法體;
    }
    	//提供一個全域性的訪問點
public static MySingleTon getInstance() { //臨界區程式碼段 if (singleTon == null) { singleTon = new MySingleTon(); } return singleTon; } }
  • 餓漢模式:指全域性的單例例項在類裝載時構建
class MySingleTon2 {
    private static MySingleTon2 singleTon2 = new MySingleTon2();
    private
MySingleTon2() { //構造方法體 } //提供一個全域性訪問點 public static MySingleTon2 getInstance() { return singleTon2; } }
  • 雙重加鎖機制:雙重檢驗,可重入函式
class MySingleTon {
    private static MySingleTon singleTon = null;
    private static Object lock = new Object();
    private MySingleTon() {
        System.
out.println("MySigleTon().init"); } public static MySingleTon getInstance() { if (singleTon == null) { synchronized (lock) { if (singleTon == null) { singleTon = new MySingleTon(); } } } return singleTon; } }
  • 內部類實現單例模式
class MySingleTon3 {
    private MySingleTon3() {
        //類構造方法;
    }
    //只有訪問靜態內部類的時候才會建立物件
    private static class SingleTon {
        private static MySingleTon3 singleTon3 = new MySingleTon3() ;
    }
    public static MySingleTon3 getInstance() {
        return SingleTon.singleTon3;
    }
}

二、類的繼承

  1. 繼承的概念

  繼承是面向物件程式設計的主要特徵之一,允許重用父類建立子類,子類將繼承父類的suo’you資料和行為,還可以定義其他資料和行為。即子類具有兩個有效型別:子類的型別以及繼承的父類的型別。

  1. 繼承的型別

Java包含兩種繼承型別:

  • 類繼承

類繼承一般用於增加現有型別的功能,或許多相關的型別共享一組重要的公共功能的場合。

  • 介面繼承

介面繼承表示一個類實現若干介面,介面僅包含方法的簽名,故介面繼承不繼承任何實現程式碼。介面繼承一般用於指定該型別具有某類可用的特徵。

  1. 派生類的宣告

在宣告派生類時可以指定要繼承的類,如果在類定義時沒有指定基類,Java編譯器將假定Object是基類,派生類使用關鍵字extends指定要繼承的類,

派生類宣告的基本形式:

[類修飾符] class 類名 [extends 基類] {
	//類體;
}
  1. super關鍵字

super關鍵字用於從派生類中訪問基類的成員

  • 指定建立派生類例項時應呼叫基類的構造方法;
super(引數);
  • 呼叫基類上已被其他方法重寫的方法;
super.方法名(引數);
  • 訪問基類的資料成員;
super.欄位名;

注意:不能再靜態方法中使用super關鍵字,super關鍵字只能在例項構造方法、例項方法或例項訪問器中使用。

  1. 類成員的繼承
  • 通過繼承,派生類繼承基類中除構造方法以外的所有成員;
  1. 派生類構造物件的初始化順序

基類的靜態塊–>派生類的靜態塊–>基類的例項程式碼塊–>基類的構造方法–>派生類的例項程式碼塊–>派生類的構造方法

  1. 基類的資料成員在派生類當中的訪問許可權
同包子類 同包非子類 不同包子類 不同包非子類
public 可以 可以 可以 可以
private 不可以 不可以 不可以 不可以
protected 可以 可以 可以 不可以
預設許可權 可以 可以 不可以 不可以

三、多型

  1. 在面向過程的程式設計中,函式不能重名否則會產生歧義從而導致編譯錯誤,所以在面向物件的程式設計中,有時需要利用“重名”來提高程式的抽象度和簡潔性。

  2. 類方法多型性的實現方式有兩種

  • 方法過載(Overloade) :可以宣告多個同名但引數的個數、型別、順序都不同的方法,編譯時根據引數的個數、型別和順序判定採用的方法。這種編譯時確定的模式,又稱為“靜態繫結”。 (函式名相同,引數列表不同,和返回值無關)

  • 方法重寫/覆蓋(Override):派生類宣告從基類繼承的方法簽名一致的方法即重寫方法,程式執行時根據執行時物件的型別,呼叫相應類的重寫方法。這種執行時確定的模式,又稱為“動態繫結”。 (函式名相同,引數列表相同,函式返回值相同。可以遵守協變型別。)

  1. 多型性:派生物件可以表示多個型別的能力,稱為物件多型性。