1. 程式人生 > >Java中的繼承、方法覆蓋(方法重寫)、super關鍵字

Java中的繼承、方法覆蓋(方法重寫)、super關鍵字

Java繼承

  • 繼承

繼承是面向物件的一個重要的特性,它體現了類與類之間的一些邏輯關係,目的是為了程式碼複用(以減少開發成本)。當多個類之間有一些共同的屬性(成員變數)和功能(成員方法)時,我們可以將他們共同的部分拿出來作為一個父類定義實現這些共性,這些類中可以不再定義這些共性而直接繼承父類,得到這些屬性和功能。
繼承體現了客觀事物中事物的層次關係。在Java程式中支援單繼承(任何一個子類都只能有一個父類),支援多層繼承,不支援多重繼承。
繼承關鍵字extends
定義類時在extends關鍵字後指明新定義的父類,使得在兩個類之間建立繼承關係。
子類、父類建議定義在多各中Java檔案中。

	public class <父類型別>() {
		<定義成員變數>;
		public <成員方法的返回值> <成員方法名稱>() {
			<成員方法中要實現的邏輯功能語句>;
		}
	}
	public class <子類型別> extends <父類型別> {
		
	}

這樣就簡單的完成了一個邏輯功能。
子類只能繼承父類的以public、protected、無修飾的訪問修飾符修飾的成員變數和成員方法,也就是說父類中被private修飾的成員變數和成員方法不能被子類繼承。構造方法不能被繼承。
Object類是所有類的父類。

  • instanceof(運算子)關鍵字
    <物件名> instanceof <本類型別>運算結果為true
    <物件名> instanceof <父類型別>運算結果為true
    <父類引用指向子類物件的物件名> instanceof <父類型別>運算結果為true
    <父類引用指向子類物件的物件名> instanceof <子類型別>運算結果為true
    <介面實現類的物件名> instanceof <介面型別型別>運算結果為true
    <物件> instanceof <類>運算子的作用是判斷物件是否是這個類或它的子類產生的,是否實現了某個介面。
	public class Demo {
    public static void main(String[] args) {
    	<父類> <物件名1> = new <父類構造方法>();
    	<子類> <物件名2> = new <子類構造方法>();
    	<父類> <物件名3> = new <子類構造方法>();
    	System.out.println(<物件名1> instanceof <父類型別>);//true
    	System.out.println(<物件名2> instanceof <子類型別>);//true
    	System.out.println(<物件名2> instanceof <父類型別>);//true
    	System.out.println(<物件名3> instanceof <父類型別>);//true
    	System.out.println(<物件名3> instanceof <子類型別>);//true
    	System.out.println(<介面實現類的物件名> instanceof <介面型別>);//true
    }
}
  • 繼承的優、缺點
    繼承為了實現程式碼複用,提高程式碼維護性,讓類與類之間產生聯絡(多型的前提)。但與此同時提高了類與類之間的耦合度。
    程式設計目的:高內聚、低耦合。
  • 方法覆蓋(方法重寫)override

方法覆蓋只可以重寫父類中允許子類訪問的方法(非private的方法)
Java程式在繼承體系中,子類可以根據各自的需求重新定義繼承父類的成員方法,即子類可以改寫父類方法所實現的功能。
子類重寫的方法必須與父類中被重寫的方法有相同的方法名稱、引數型別引數個數且一一對應。
子類中重寫的方法訪問許可權修飾符不能比被重寫的方法訪問許可權修飾符小。
子類中重寫的方法不能丟擲新的異常。
在子類要覆蓋的方法上一行新增@Override語句來來提高程式碼的閱讀性。當@Override下的方法不是覆蓋父類方法時,編譯器會報錯。
方法重寫使得Java程式支援多型,而多型性是面向物件的程式設計的特性之一。當相同方法被不同子類物件呼叫時,產生不同的操作,以實現不同的邏輯功能。

  • super關鍵字

靜態方法中不能使用this和super。因為this和super代表著本類物件和父類物件。靜態方法中不能應用非靜態成員和非靜態方法。
引入super的一部分原因是子類和父類的成員變數和成員方法(重寫後的方法和重寫前的方法)重名時,所區分的一種方式。一般地在某個{}內使用成員變數時,現在本{}語句體中查詢同名變數,假如沒有就在本類地成員變數中查詢,還沒有就在父類地成員變數中查詢,還沒找到的話就報錯。
當子類在重寫父類方法後,使用父類被覆蓋的方法時,用super.<父類方法名>;來呼叫父類的成員方法。也可以通過super();呼叫父類中的構造方法,呼叫位置只能是在子類的構造方法中的第一條,且父類中有相關構造方法。另外每個子類的構造方法中第一個語句預設都是super();。當父類中定義了構造方法後(沒有定義預設的無參構造方法),子類不能使用父類的預設構造方法。