一、RabbitMQ 的概念
阿新 • • 發佈:2021-09-01
多型指的是同一個方法呼叫,由於物件不同可能會有不同的行為。現實生活中,同一個方法,具體實現會完全不同。 比如:同樣是呼叫人的“休息”方法,張三是睡覺,李四是旅遊,高淇老師是敲程式碼,數學教授是做數學題; 同樣是呼叫人“吃飯”的方法,中國人用筷子吃飯,英國人用刀叉吃飯,印度人用手吃飯。
多型的要點:
1. 多型是方法的多型,不是屬性的多型(多型與屬性無關)。
2. 多型的存在要有3個必要條件:繼承,方法重寫,父類引用指向子類物件。
3. 父類引用指向子類物件後,用該父類引用呼叫子類重寫的方法,此時多型就出現了。
【示例5-12】多型和型別轉換測試
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
class Animal{
public void shout(){
System.out.println( "叫了一聲!" );
}
}
class Dog extends Animal{
public void shout(){
System.out.println( "旺旺旺!" );
}
public void seeDoor(){
System.out.println( "看門中...." );
}
}
class Cat extends Animal{
public void shout(){
System.out.println( "喵喵喵喵!" );
}
}
public class TestPolym{
public static void main(String[]args){
Animala1= new Cat(); //向上可以自動轉型
//傳的具體是哪一個類就呼叫哪一個類的方法。大大提高了程式的可擴充套件性。
animalCry(a1);
Animala2= new Dog();
animalCry(a2); //a2為編譯型別,Dog物件才是執行時型別。
//編寫程式時,如果想呼叫執行時型別的方法,只能進行強制型別轉換。
//否則通不過編譯器的檢查。
Dogdog=(Dog)a2; //向下需要強制型別轉換
dog.seeDoor();
}
//有了多型,只需要讓增加的這個類繼承Animal類就可以了。
static void animalCry(Animala){
a.shout();
}
/*如果沒有多型,我們這裡需要寫很多過載的方法。
*每增加一種動物,就需要過載一種動物的喊叫方法。非常麻煩。
staticvoidanimalCry(Dogd){
d.shout();
}
staticvoidanimalCry(Catc){
c.shout();
}*/
}
|
執行結果如圖5-17所示:
圖5-17 示例5-12執行效果圖
示例5-12給大家展示了多型最為多見的一種用法,即父類引用做方法的形參,實參可以是任意的子類物件,可以通過不同的子類物件實現不同的行為方式。
由此,我們可以看出多型的主要優勢是提高了程式碼的可擴充套件性,符合開閉原則。但是多型也有弊端,就是無法呼叫子類特有的功能,比如,我不能使用父類的引用變數呼叫Dog類特有的seeDoor()方法。
那如果我們就想使用子類特有的功能行不行呢?行!這就是我們下一章節所講的內容:物件的轉型。