1. 程式人生 > >面向物件程式設計----繼承---筆記

面向物件程式設計----繼承---筆記

繼承關係: 父與子(官方) 類與類之間的關係
繼承與屬性和方法有關
實現繼承 , 子類 extends + 父類
所有的實現類
為什麼需要繼承?
• 是為了實現方法的多型, 實現程式碼的重用
為什麼繼承可以實現程式碼的重用?
• 繼承可以使得子類具有父類別的各種屬性和方法,而不需要再次編寫相同的程式碼
繼承的解析:
§ 現今面向物件程式設計技巧中,繼承並非以繼承類別的“行為”為主,而是繼承類別的“型別”,使得元件的型別一致。
§ 另外在設計模式中提到一個守則,“多用合成,少用繼承”,此守則也是用來處理繼承無法在執行期動態擴充套件行為的遺憾。

多繼承: 在c++中有體現
使用單繼承的優點:
多繼承會讓子類"可控性"越來越差,單繼承會使子類更為可控.
多繼承在現實生活中會很強大,但是用於程式設計時,可控性差
Tips : Object 父類-基類-超類
○ 同包約束, 繼承->同包時可以繼承,不同包也能繼承
○ 1 作為子類,任何時候都可以繼承到protected修飾的內容
(子類和父類同不同包沒關係)
○ 2 預設預設的許可權修飾符, 只能在同一個包中進行訪問
3 私有的,則只能在本類中進行訪問
子類如果定義了一個與父類一樣名稱的變數, 則會覆蓋父類的對應名稱的變數的值(屬性的覆蓋或屬性的隱藏)
不管子類中的內容如何修改,都不會影響父類中的值
在類中直接定義的屬性未手動賦值,(沒有分配初始值, 那麼程式會自動生成初始值 ), 此時修改該屬性的值必須在方法中或者語句塊中去實現.
子類重寫方法:
子類呼叫方法的時候, 會優先呼叫子類的方法, 如果找不到對應的方法, 那麼再呼叫父類的方法
方法重寫:
在父類中定義一個方法, 其子類中也定義一個一模一樣的方法
方法重寫和方法過載是兩碼事
@Override 符號表示重寫,放在方法名之前
@Override 就是註解, 表示驗證一下這個方法是否是重寫
在企業規範中, 是必須要寫@Override的, 這是規範
方法重寫的規則: (範圍: 必須有繼承關係)
§ 父類和子類的方法名必須相同
§ 父類和子類的方法形參必須相同
§ 父類和子類的返回值型別必須相同
§ 父類方法的許可權修飾符的範圍可以小於等於子類中的方法(如果父類中定義的是protected, 子類可以是protected/public
§ 方法體可以自行定義
方法過載的規則: (範圍: 在本類中實現)
§ 過載的英文單詞為overload
過載與重寫的區別:
§ 重寫必須存在繼承關係, 過載是在本類中存在
§ 過載關心的是: 方法名相同, 引數不同(個數,順序,型別), 與返回值無關
§ 重寫關心的是: 方法名相同, 引數相同, 返回型別相同, 許可權修飾符可以不同
§ 重寫的許可權修飾符, 子類中的範圍 >= 父類中的範圍; 過載的許可權修飾符可以不同.

Tips: final修飾的方法是不能被繼承的(也不能被重寫)
被final修飾的類是不能被繼承的(eg.String, 包裝類, Math)

構造方法的繼承:
§ 預設情況下,在每一個子類的建構函式的第一行,呼叫super()方法
public class son extends father {
public son() {
super(); //初始化當前子類的時候, 首先會去呼叫父類的構造方法. 必須放在構造器的第一行

}
}
//如果顯示的定義了父類的構造器,而且帶引數,那麼這個構造器就會把原有的隱式構造方法給覆蓋掉
當子類在呼叫父類的建構函式時, super()需要和父類中的建構函式保持一致. 如果有引數, 則必須傳值.
關鍵字this:
this(); //代表呼叫本類的無參構造器
this()和super()不能共存
注意: 建立一個子類物件的時候,雖然直觀看到的是呼叫的是子類的構造,但是必須先呼叫父類的構造器才行.
沒有成功呼叫父類的構造時, 子類物件建立就會失敗;
子類的構造器中, super()和this()不能同時存在
this和super都必須放在構造器的第一行