Java-多態——面向對象(高級篇)

什麼是多態

1.面向對象的三大特性:
封裝、繼承、多態,多態是建立在繼承之上的,封裝和繼承幾乎都是爲多態而準備的。多態性在面向對象中是一個最重要的概念。
2. 多態,指允許不同類的對象對同一消息作出相應。
即同一消息可以根據發送消息的不同而採用多種不同的行爲方式。簡單地說,就是指同一行爲在不同對象下所產生的不同表現形式。
比如,按下F1鍵的行爲:
在Flash界面下彈出的是AS3的幫助文檔;
在Word界面下彈出的是Word幫助;
在Windows界面下彈出的是Windows幫助和支持。
可見,同一行爲在不同的對象下產生的結果會不同。
3.多態的作用:
消除類型之間的耦合關係。
4.多態存在的三個必要條件:
繼承;重寫;父類引用指向子類對象(向上轉型)。
當使用多態方式調用方法時,首先檢查父類中是否有該方法。如果沒有,則編譯錯誤;如果有,再去調用子類的同名方法。
**在進行對象的向下轉型前,必須首先發生對象的向上轉型,否則將出現對象轉換異常。 **
5.對象多態性的兩種類型 (class B extends A)
(1)向上轉型:子類對象 父類對象
格式:子類 子類對象 = new子類 ;
父類 父類對象 = 子類實例 ;
(B b = new B;A a = b;)

父類 父類對象 = new 子類;
(A a = new B;)
具體代碼如下:

class A{
	public void fun1() {
		System.out.println("A-->public void fun1()");
	}
	public void fun2() {
		this.fun1();
	}
};
class B extends A{
	public void fun1() {
		System.out.println("B-->public void fun1()");
	}
	public void fun3() {
		System.out.println("B-->public void fun3()");
	}
};
public class PolDemo01 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		B b = new B();
		A a = b;
		a.fun1();

	}

}

運行結果:

B-->public void fun1()

(2)向下轉型:父類對象 子類對象
格式:子類 子類對象 = (子類)父類實例;
(B b = (B) a)【前提:A a = new B;】
具體代碼如下:

package 多態;
class A{
	public void fun1() {
		System.out.println("A-->public void fun1()");
	}
	public void fun2() {
		this.fun1();
	}
};
class B extends A{
	public void fun1() {
		System.out.println("B-->public void fun1()");
	}
	public void fun3() {
		System.out.println("B-->public void fun3()");
	}
};
public class PolDemo02 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		A a = new B();
		B b = (B) a;
		b.fun1();
		b.fun2();
		b.fun3();

	}

}

運行結果:

B-->public void fun1()
B-->public void fun1()
B-->public void fun3()

多態的優點

1.可替換性
即多態對已存在的代碼具有可替換性。例如,多態對圓Circle類工作,對其他任何圓形幾何體,如圓環,也同樣工作。
2.可擴充性
即多態對代碼具有可擴充性。增加新的子類不影響已存在類的多態性、繼承性,以及其他特性的運行和操作。新添加的子類更容易獲得多態功能。例如,在實現圓錐、半圓錐以及半球體的多態的基礎上,很容易添加球體類的多態性。
3.接口性
即超類通過方法簽名,向子類提供了一個共同接口,由子類來完善或者覆蓋它而實現。
4.靈活性
即靈活多樣的操作,提高了使用的效率。
5.簡化性
即簡化了對應用軟件的代碼編寫和修改過程,尤其在處理大量對象的運算和操作方面。

對象向下轉型的要求

範例:錯誤的轉型

package 多態;
class A{
	public void fun1() {
		System.out.println("A-->public void fun1()");
	}
	public void fun2() {
		this.fun1();
	}
};
class B extends A{
	public void fun1() {
		System.out.println("B-->public void fun1()");
	}
	public void fun3() {
		System.out.println("B-->public void fun3()");
	}
};
public class PolDemo03 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		A a = new A();
		B b = (B) a;
		b.fun1();
		b.fun2();
		b.fun3();

	}

}

運行結果:

Exception in thread "main" java.lang.ClassCastException: 多態.A cannot be cast to 多態.B
	at 多態.PolDemo03main(PolDemo02.java:23)

由代碼可知,A類對象是由A類本身進行實例化的,然後將A類的實例化對象強制轉換成子類對象。這樣在語法上是沒有任何錯誤的,但父類用其本身實例化自己的對象,但它並不知道自己的子類是誰,在轉換上肯定會出現錯誤,所以要將兩個對象建立好關係,即在聲明父類對象時先發生向上轉型關係“A a = new B()”,相當於用子類去實例化父類對象,父類就知道自己有一個B類子類,那麼在進行轉化時就不會再有錯誤產生了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章