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有所幫助!!!😄😄😄