單例模式、類的繼承和多型
一、單例模式
單例模式是一種常用的軟體設計模式,在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中應用該模式的類,一個類只能有一個例項,即一個類只有一個物件例項。
-
Java中單例模式定義:一個類有且僅有一個例項,並且自行例項化向整個系統提供。
-
構建方式:
- 懶漢模式:指全域性的單例例項在第一次被使用時構建
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;
}
}
二、類的繼承
- 繼承的概念
繼承是面向物件程式設計的主要特徵之一,允許重用父類建立子類,子類將繼承父類的suo’you資料和行為,還可以定義其他資料和行為。即子類具有兩個有效型別:子類的型別以及繼承的父類的型別。
- 繼承的型別
Java包含兩種繼承型別:
- 類繼承
類繼承一般用於增加現有型別的功能,或許多相關的型別共享一組重要的公共功能的場合。
- 介面繼承
介面繼承表示一個類實現若干介面,介面僅包含方法的簽名,故介面繼承不繼承任何實現程式碼。介面繼承一般用於指定該型別具有某類可用的特徵。
- 派生類的宣告
在宣告派生類時可以指定要繼承的類,如果在類定義時沒有指定基類,Java編譯器將假定Object是基類,派生類使用關鍵字extends
指定要繼承的類,
派生類宣告的基本形式:
[類修飾符] class 類名 [extends 基類] {
//類體;
}
- super關鍵字
super關鍵字用於從派生類中訪問基類的成員
- 指定建立派生類例項時應呼叫基類的構造方法;
super(引數);
- 呼叫基類上已被其他方法重寫的方法;
super.方法名(引數);
- 訪問基類的資料成員;
super.欄位名;
注意:不能再靜態方法中使用super關鍵字,super關鍵字只能在例項構造方法、例項方法或例項訪問器中使用。
- 類成員的繼承
- 通過繼承,派生類繼承基類中除構造方法以外的所有成員;
- 派生類構造物件的初始化順序
基類的靜態塊–>派生類的靜態塊–>基類的例項程式碼塊–>基類的構造方法–>派生類的例項程式碼塊–>派生類的構造方法
- 基類的資料成員在派生類當中的訪問許可權
同包子類 | 同包非子類 | 不同包子類 | 不同包非子類 | |
---|---|---|---|---|
public | 可以 | 可以 | 可以 | 可以 |
private | 不可以 | 不可以 | 不可以 | 不可以 |
protected | 可以 | 可以 | 可以 | 不可以 |
預設許可權 | 可以 | 可以 | 不可以 | 不可以 |
三、多型
-
在面向過程的程式設計中,函式不能重名否則會產生歧義從而導致編譯錯誤,所以在面向物件的程式設計中,有時需要利用“重名”來提高程式的抽象度和簡潔性。
-
類方法多型性的實現方式有兩種
-
方法過載(Overloade) :可以宣告多個同名但引數的個數、型別、順序都不同的方法,編譯時根據引數的個數、型別和順序判定採用的方法。這種編譯時確定的模式,又稱為“靜態繫結”。 (函式名相同,引數列表不同,和返回值無關)
-
方法重寫/覆蓋(Override):派生類宣告從基類繼承的方法簽名一致的方法即重寫方法,程式執行時根據執行時物件的型別,呼叫相應類的重寫方法。這種執行時確定的模式,又稱為“動態繫結”。 (函式名相同,引數列表相同,函式返回值相同。可以遵守協變型別。)
- 多型性:派生物件可以表示多個型別的能力,稱為物件多型性。