1. 程式人生 > >Java基礎知識回顧之多型性

Java基礎知識回顧之多型性

Java基礎知識回顧之封裝性
Java基礎知識回顧之繼承性
Java基礎知識回顧之多型性

簡介

多型的核心就是型別的一致性。物件上的每一個引用和靜態的型別檢查器都要確認這樣的依附(多個子類繼承一個父類)。

多型性嚴格來講有兩種描述形式

  • 方法的多型性

    • 方法的過載:同一個方法名稱,會根據傳入引數的型別以及個數不同執行不同的方法體。
    • 方法的覆寫:同一個方法,會根據子類的不同實現,實現不同的功能。
  • 物件的多型性:指的是發生在繼承關係類之中,子類和父類之間的轉換問題。

    • 向上轉型(自動完成):父類 父類物件 = 子類例項;
    • 向下轉型(強制轉換): 子類 子類物件 = (子類)父類例項;

例項說明

向上轉型

class A{
	public void print() {
		System.out.println("A、public void print()");
	}
}

class B extends A{
	@Override
	public void print() {
		System.out.println("B、public void print()");
	}
}

public class TestDemo {
	
	public static void main
(String[] args) { // 使用向上轉型 A a = new B(); a.print(); // 輸出結果: B、public void print() } }

向下轉型

public class TestDemo {
	
	public static void main(String[] args) {
		//  使用向上轉型
		A a = new B();
		a.print();		// 輸出結果: B、public void print()
		
		// 向下轉型,強制轉換
		B b = (B) a;	// 輸出結果: B、public void print()
} }

說明

向上轉型:由於所有的子類物件例項都可以自動的向上轉型,所以在於引數的統一上。即:同一個方法針對於不同的子類可以有不同的實現。

class A{
	public void print() {
		System.out.println("A、public void print()");
	}
}

class B extends A{
	@Override
	public void print() {
		System.out.println("B、public void print()");
	}
}

class C extends A{
	@Override
	public void print() {
		System.out.println("C、public void print()");
	}
}

public class TestDemo {
	
	public static void main(String[] args) {
		// 只要是A類的子類都可以使用向上轉型,由A類接收
		// 同一個方法針對於不同的子類可以有不同的實現
		A a1 = new B();
		A a2 = new B();
		a1.print();		// 輸出結果: B、public void print()
		a2.print();		// 輸出結果: C、public void print()		
	}
}

向下轉型:指的是父類要呼叫子類自己特殊的方法;所有的父類只能呼叫到在父類中定義了的資訊,對於子類擴充的方法,是呼叫不到的,對於這個情況,就需要向下轉型,獲取子類的特殊方法。

class A{
	public void print() {
		System.out.println("A、public void print()");
	}
}

class B extends A{
	@Override
	public void print() {
		System.out.println("B、public void print()");
	}
	
	public void funB() {
		System.out.println("B 中擴充的方法");
	}
}

public class TestDemo {
	
	public static void main(String[] args) {
		// 通過向上轉型獲取到 A 物件
		A a = new B();	
		
		//  a.funB(); 此時這段是會報錯的,因為 a 類中沒有 funB方法。
		// 如果需要呼叫,就需要使用向下轉型
		B b = (B) a;
		b.funB();	// 此時就可以呼叫 funB方法
	}
}