正文
多態的存在有三個必要的條件:
要有繼承(兩個類之間存在繼承關係,子類繼承父類)
要有重寫(在子類裏面重寫從父類繼承下來的方法)
-
父類引用指向子類對象
這三個條件一旦滿足,當你調用父類裏面被重寫的方法的時候,實際當中new的是哪個子類對象,就調用這個子類對象的方法。下面以代碼進行說明:
這裏創建了一個Animal
類,作爲父類:
package com.mlin;
public class Animal {
//私有成員變量
private String name;
//構造方法
Animal(String name){
this.name = name;
}
//這裏定義了一個方法
public void call(){
System.out.println("動物......");
}
}
創建兩個子類,分別爲Cat
類和Dog
類,它們都繼承Animal
類:
package com.mlin;
public class Cat extends Animal {
//定義自己的私有成員變量
private String catColor;
//構造方法
Cat(String name ,String catColor) {
super(name);//在構造方法的實現裏面首先使用super調用父類Animal的構造方法Animal(String name),把子類對象裏面的父類對象先造出來
this.catColor = catColor;
}
//這裏是重寫了call方法
public void call(){
System.out.println("我是cat哦....");
}
}
package com.mlin;
public class Dog extends Animal {
//定義自己的私有成員變量
private String dogColor;
//構造方法
Dog(String name ,String dogColor) {
super(name);//在構造方法的實現裏面首先使用super調用父類Animal的構造方法Animal(String name),把子類對象裏面的父類對象先造出來
this.dogColor = dogColor;
}
//這裏是重寫了call方法
public void call(){
System.out.println("我是dog哦....");
}
}
創建一個person類,用於飼養寵物:
package com.mlin;
public class Person {
//定義兩個私有成員變量
private String name;
private Animal pet;
/**
* 在person類裏面定義構造方法,第二個參數是Animal類型給程序帶來了靈活性
* 因爲這個Animal類型的參數是父類對象的引用類型,因此當我們傳參數的時候,
* 可以把這個父類的子類對象傳過去,即傳Dog、Cat都可以。
* @param name
* @param pet
*/
Person(String name,Animal pet){
this.name = name;
this.pet = pet;
}
public void myCall(){
pet.call(); //傳了什麼對象進來,就讓這個對象去調用它自己的call方法
}
public static void main(String arg[]){
//這裏分別new了一個cat對象和dog對象,這兩個都包含一個父類Animal對象
Cat cat = new Cat("catname", "black");
Dog dog = new Dog("dogname","yellow");
//這裏new了兩個person對象,分別爲p1,養了一個cat,另一個是p2,養了一隻dog
Person p1 = new Person("andy", cat);
Person p2 = new Person("andy", dog);
//兩個person對象調用了myCall方法,使他們自己的寵物調用自己的call方法
p1.myCall();
p2.myCall();
}
}
運行結果如下:
以上就實現了動態綁定,也就是多態。
原創作者:凌小樣
作品鏈接:https://www.jianshu.com/p/c8160a2bd019
【原創不易,轉載請註明出處,感謝理解】
一位愛生活,愛創作,愛分享,愛自己的90後女程序員一枚,記錄工作中的點點滴滴,一起學習,共同進步,期待能和優秀的您交上朋友