Java筆記03-Constructor & Override
構造方法基本概念
構造方法是類中的一種特殊方法
它是在類創建對象(實例化)的時候自動調用的方法
這個和python中的__init__
初始化魔術方法類似
可以在創建對象的時候進行參數的傳遞
默認送您的構造
一個類編譯過后都需要有一個構造方法.如果程序中沒有寫的話
編譯器在編譯時就會幫你加上一個無參數的空的構造方法(稱之為"默認的構造方法")
那要是你定義了構造方法了,編譯器也不欠欠的幫你加了,它也懶
關于構造的建議
-
當類中有成員變量,并且還不是常量的時候,建議提供兩個版本的構造方法,一個無參數的構造,一個全屬性的構造
-
而類中所有成員變量都是常量或者干脆就沒有成員變量的時候,建議不要寫構造
成員方法重載
說白了就是同樣名稱的方法,可以有很多不同參數列表的版本,有的有參數,有的沒有參數,而方法名一樣
這樣官方說能讓類的設計變的更加優雅,我是沒看出來
好像是能夠一個方法處理不同的數據
這樣的設計方式成為重載設計
this關鍵字
this
就是代表對象本身(調用該方法的對象)
就像JavaScript
中的this
就像python
中的self
OOP三大特性之封裝
封裝的面向對象的三大特性之一,
如果代碼不做限制,則很多屬性值是無效的
封裝就是保證屬性值有效的技術
封裝的步驟
-
屬性(不是常量的)必須使用private修飾,確保外部變量無法直接進行賦值操作
-
提供操作屬性的方法,一般都是讀寫屬性方法,get屬性和set屬性方法
-
構造方法中,也要通過調用set和get方法來操作
static關鍵字
靜態static關鍵字修飾屬性或者方法
可以將對象層級從對象級升級成為類級別,在類加載的時候就可以調用準備好的屬性或者方法
換句話說就是static修飾的可以直接進行調用
單例設計模式
設計模式是形成標準化流程的經驗總結,是特定問題的固定的解決方案
單例設計思路:
1. 先private構造,阻止外部去創建對象
2. 本類提供一個對象,定義一個private static 的本類類型的屬性
3. 對外提供get方法,將唯一的對象返回到外部
單例分為餓漢式和懶漢式兩種寫法
java中單例模式是一種常見的設計模式,在實際開發中比較常用
具體詳細內容可以參考:Java設計模式之單例模式
OOP三大特性之繼承
繼承就是子類復用父類的代碼
使用關鍵字extends表示類和類之間的繼承關系
class Son extends Father{// ...
}
Java中不能多繼承,可以通過接口的多實現來彌補類的多繼承
繼承中的構造方法
子類必須通過super();
關鍵字才能調用父類中的構造方法
這樣才能好好的初始化來自父類的成員變量
this()
和super()
必須出現在構造的第一行,因此不可能同時出現
方法的重寫
- 有些父類寫好的方法,子類它不太喜歡
子類就可以使用方法重寫(覆蓋)來改變他爸爸給他的方法
- 方法重寫的原則:
1. 相同的方法名稱,相同的參數列表,相同的返回值類型或者返回子類
2. 訪問權限不能變小,可以變大
3. 不能拋出更大的異常
- 在子類重寫的方法中,可以通過
super
關鍵字調用父類的"原始"方法. static
方法重寫之后還是static
的
OOP三大特性之多態
一母生九子,九子各不同
Person p = new Student();
- 只能使用母類中定義的屬性和方法
- 不能直接使用子類中擴展的屬性和方法
- 如果子類重寫了方法,靜態方法調父類的,非靜態方法調子類的
原因:
編譯時,p被認為是Person類型;但在運行時是Student類型.在內存中其實是子類對象.
總結:
左
父右
子即為多態
多態特點
多態時,如果想要把擴展的屬性和方法調用出來,需要做類型轉換
父類
轉子類
需要做強制類型轉換(向下
轉型)
子類
轉父類
需要做強制類型轉換(向上
轉型)
對象強制類型轉換是一種還原行為,必須內存中是該類型的對象才能成功
instanceof運算符
instanceof
就是判斷對象的類型,如果是該類型返回true
,不是返回false
語法格式:
對象 instanceof 類型
obj instanceof Object
p instanceof Person
嚴格的來說,在進行對象的向下轉型之前,都得instanceof一下才能
這個instanceof必須發生在父子之間才行哦!
抽象類
用abstract修飾的類,這個類吧就厲害了
它不能實例化,這可咋用啊
唉,對 就是用來繼承的,你不能實例化你兒子行啊
抽象方法所在類必須是抽象類,而子類如果不是抽象類,一定要重寫父類中的抽象方法才行(實現父類的方法體)