什么是多態(tài)
A: 方法或?qū)ο缶哂卸喾N形態(tài),是面向?qū)ο蟮牡谌筇卣?,多態(tài)是建立在封裝和繼承的基礎(chǔ)之上的。簡單來說,多態(tài)是具有表現(xiàn)多種形態(tài)的能力的特征。
多態(tài)的優(yōu)點
- 消除類型之間的耦合關(guān)系
- 可替代性
- 可擴(kuò)充性
- 接口性
- 靈活性
- 簡化性
多態(tài)的分類
重載式多態(tài)
重載式多態(tài)在編譯時已經(jīng)確定好了。方法名相同而參數(shù)列表不同的一組方法就是重載。在調(diào)用這種重載的方法時,通過傳入不同的參數(shù)最后得到不同的結(jié)果。
案例
public void add(int a, int b) {
int c = a + b;
System.out.println("兩個整數(shù)相加得 " + c);
}
public void add(float a, float b) {
float c = a + b;
System.out.println("兩個float型浮點數(shù)相加得" + c);
}
重寫式多態(tài)
重寫式多態(tài)是指在執(zhí)行期間判斷所引用對象的實際類型,根據(jù)其實際的類型調(diào)用其相應(yīng)的方法。也就是說,只有程序運行起來,你才知道調(diào)用的是哪個子類的方法。 這種多態(tài)通過函數(shù)的重寫以及向上轉(zhuǎn)型來實現(xiàn),我們接下來講的所有多態(tài)都是重寫式多態(tài),因為它才是面向?qū)ο缶幊讨姓嬲亩鄳B(tài)。
多態(tài)的向上轉(zhuǎn)型
Q:什么是多態(tài)的向上轉(zhuǎn)型?
A:父類的引用指向子類的對象叫做向上轉(zhuǎn)型。
Q:向上轉(zhuǎn)型的怎么寫?
A:父類類型 引用名 = new 子類類型();
Q:向上轉(zhuǎn)型有什么特點?
A:編譯類型看左邊,運行類型看右邊??梢哉{(diào)用父類中的所有成員。最終運行效果看子類的具體實現(xiàn)。
案例
//動物類,擁有一個call()方法
class Animal {
public void call() {
System.out.println("動物叫!");
}
}
// 狗類,實現(xiàn)父類動物,并重寫call()方法
class Dog extends Animal {
public void call() {
System.out.println("汪汪!");
}
public void color() {
System.out.println("狗狗顏色!");
}
}
// 貓類,實現(xiàn)父類動物,并重寫call()方法
class Cat extends Animal {
public void call() {
System.out.println("喵~");
}
public void color() {
System.out.println("貓貓顏色!");
}
}
//測試類
public class Test {
public static void main(String[] args) {
//向上轉(zhuǎn)型
Animal animal = new Dog();
animal.call();
animal = new Cat();
animal.call();
}
}
這里 Animal animal = new Dog();
將子類對象Dog
轉(zhuǎn)化為父類對象Animal
,這個時候Animal
引用指向的是子類對象,所以調(diào)用的方法是子類方法。
向上轉(zhuǎn)型時,子類單獨定義的方法會丟失。比如,上面案例中的Dog
類和Cat
類都定義了自己的call
方法,當(dāng)進(jìn)行了向上轉(zhuǎn)型后,Animal
引用指向Dog
類的實例時是訪問不到color
方法的,Animal.color()
會報錯。
多態(tài)的向下轉(zhuǎn)型
Q:什么是多態(tài)的向下轉(zhuǎn)型?
A:子類引用指向父類對象(父類型,實例是子類的實例化)叫做多態(tài)的向下轉(zhuǎn)型。通常需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換。
案例
//動物類,擁有一個call()方法
class Animal {
public void call() {
System.out.println("動物叫!");
}
}
// 狗類,實現(xiàn)父類動物,并重寫call()方法
class Dog extends Animal {
public void call() {
System.out.println("汪汪!");
}
public void color() {
System.out.println("狗狗顏色!");
}
}
// 貓類,實現(xiàn)父類動物,并重寫call()方法
class Cat extends Animal {
public void call() {
System.out.println("喵~");
}
public void color() {
System.out.println("貓貓顏色!");
}
}
//測試類
public class Test {
public static void main(String[] args) {
//向上轉(zhuǎn)型
Animal animal = new Dog();
//向下轉(zhuǎn)型
Dog dog = (Dog)animal;//向下轉(zhuǎn)型,強(qiáng)制類型轉(zhuǎn)換
dog.color();//輸出狗狗顏色!
Cat cat = (Cat)animal;//報錯
Animal animal = new Animal();
Dog dog = (Dog)animal;//報錯
}
}
這里需要注意Dog dog = (Dog)Animal;
可以正常運行,是因為dog
本身就是Dog
對象,可以正常轉(zhuǎn)型為Dog
,而不能轉(zhuǎn)型為Cat
。aniaml
類是Animal
對象,他也不能向下轉(zhuǎn)型成任何子類對象。文章來源:http://www.zghlxwxcb.cn/news/detail-808651.html
|
1)向下轉(zhuǎn)型的前提是父類引用指向的是子類對象,也就是說,向下轉(zhuǎn)型之前,它得先進(jìn)行過向上轉(zhuǎn)型。
2)向下轉(zhuǎn)型只能轉(zhuǎn)型為本類對象。文章來源地址http://www.zghlxwxcb.cn/news/detail-808651.html
到了這里,關(guān)于【Java面向?qū)ο蟆慷鄳B(tài)的詳細(xì)介紹,簡單易懂,看這一篇就夠了的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!