Java——三大特性之一:多態(概念理解+應用舉例)

1.概念理解

在Java語言中,具有着三大特性:封裝、繼承和多態。

那麼,在之前的博文中,已經講過了封裝和繼承,詳細的內容可以參考博主下面的這兩篇博文鏈接:👇👇👇

封裝博文鏈接:https://blog.csdn.net/weixin_43823808/article/details/106330673
繼承博文鏈接:https://blog.csdn.net/weixin_43823808/article/details/106349135

在這篇博文中,主要爲大家講解一下我對多態的理解:

多態是同一個行爲具有多個不同表現形式或形態的能力,多態性是對象多種表現形式的體現。 

多態就是同一個接口,使用不同的實例而執行不同操作,如圖所示:👇👇👇

1.1 多態的優點 

①消除類型之間的耦合關係。

②可替換性。

③可擴充性。

④接口性。

⑤靈活性。

⑥簡化性。

1.2 多態存在的三個必要條件

①繼承。(子類繼承父類,也可以是非抽象子類繼承抽象父類)

②重寫。 (子類對父類中方法的重寫)

③父類引用子類對象。(向上轉型,也可以通過向下轉型再轉換回來)

當使用多態方式調用某個方法時,首先檢查父類中是否有該方法,如果沒有,則編譯的時候會報錯;如果有,再去調用子類的同名方法。

多態的好處:可以使程序有良好的擴展,並可以對所有類的對象進行通用處理。

 

2.應用舉例

Example 1: 

class Animal {
	public void hobby() {
		System.out.println("動物的叫聲有很多種!");
	}
}
class Cat extends Animal {
	public void hobby() { //子類重寫父類的 hobby 方法
		super.hobby(); //要想調用父類中被重寫的方法,必須使用 super 關鍵字
		System.out.println("貓:喵喵喵!");
	}
}
class Dog extends Animal { //Dog 子類的理解和上面的 Cat 子類是一樣的
	public void hobby() {
		super.hobby();
		System.out.println("狗:汪汪汪!");
	}
}
public class Study {
	public static void main(String[] args) {
		Animal a=new Cat(); //父類聲明對象,子類實例化對象,即向上轉型
		a.hobby();
		Animal b=new Dog(); //父類聲明對象,子類實例化對象,即向上轉型
		b.hobby();
	}
}

以上這個例子,就是Java多態性的一個體現, 通過子類繼承父類,並且子類去重寫父類的中的同名方法,最後我們通過向上轉型的方法來實現多態性。程序運行結果如下:👇👇👇

Example 2: 

abstract class Animal {//抽象類
	public abstract void eat();//繼承它的子類必須重寫這個方法
}
class Cat extends Animal {
	public void eat() {
		System.out.println("貓喜歡喫魚!");
	}
	public void work() {
		System.out.println("貓也會抓老鼠!");
	}
}
class Dog extends Animal {
	public void eat() {
		System.out.println("狗喜歡喫骨頭!");
	}
	public void work() {
		System.out.println("狗也會看家!");
	}
}
public class Testing {
	public static void show(Animal a) {//實例化一個對象a
	//在 main 方法中,直接使用類進行調用,所以 show 方法需定義爲靜態的
		a.eat(); //將兩個子類的對象進行向上轉型,並且子類已經重寫了抽象父類的抽象方法eat
		//所以就相當於在調用兩個字類中各自的 eat 方法
		if(a instanceof Cat) { //類型判斷,如果 a 是子類 Cat 的對象
			Cat b=(Cat)a;
			b.work();
		}
		else if(a instanceof Dog) { //類型判斷,如果 a 是子類 Dog 的對象
			Dog b=(Dog)a;
			b.work();
		}
	}
	public static void main(String[] args) {
		show(new Cat()); //通過 Testing 類調用 show 方法,具體在 Cat 類中實現
		show(new Dog()); //通過 Testing 類調用 show 方法,具體在 Dog 類中實現
		Animal c=new Cat(); //父類聲明對象,子類實例化對象,即向上轉型
		c.eat(); //調用 Cat 類的 eat 方法
		Cat d=(Cat)c; //將對象 c 強制轉換回來,即向下轉型
		d.work(); //調用 Cat 類的 work 方法
	}
}
show(new Cat());//等價於下面的這兩行代碼

Animal a=new Cat();//這兩行更能體現“靜態方法由類調用”這句話
Testing.show(a);

這個例子比第一個例子要複雜一點, 基本上和第一個例子中的解釋是一樣的。

但是需要注意的一點是:實例方法由對象調用,靜態方法由類調用,就是這個例子中的 show 方法(聲明爲static靜態)

具體的我已經將註釋寫的很清楚了,大家可以參考着去理解,下面是程序的運行結果:👇👇👇


那麼,以上就是博主對於Java三大特性之一——多態的理解,希望對大家學習Java有所幫助!!!😄😄😄

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