Java 多態(tài)定義
多態(tài)是同一個(gè)行為具有多個(gè)不同表現(xiàn)形式或形態(tài)的能力舱卡。
多態(tài)就是同一個(gè)接口,使用不同的實(shí)例而執(zhí)行不同操作
多態(tài)的優(yōu)點(diǎn)
1. 消除類型之間的耦合關(guān)系
2. 可替換性
3. 可擴(kuò)充性
4. 接口性
5. 靈活性
6. 簡化性
多態(tài)存在的三個(gè)必要條件
繼承
重寫
父類引用指向子類對象(比如:Parent p = new Child())
當(dāng)使用多態(tài)方式調(diào)用方法時(shí)厕氨,首先檢查父類中是否有該方法侠姑,如果沒有蔚出,則編譯錯(cuò)誤疫蔓;如果有含懊,再去調(diào)用子類的同名方法。
多態(tài)的好處:可以使程序有良好的擴(kuò)展衅胀,并可以對所有類的對象進(jìn)行通用處理。
下面的列子很好的理解多態(tài)?
public class Test {
?public static void main(String[] args)?
{?
? ? ? ?show(new Cat()); // 以 Cat 對象調(diào)用 show 方法?
? ? ? ?show(new Dog()); // 以 Dog 對象調(diào)用 show 方法
? ? ? ?Animal a = new Cat();? // 向上轉(zhuǎn)型? ? ??
? ? ? ? a.eat();? ? ? ? ? ? ? // 調(diào)用的是 Cat 的 eat? ? ??
? ? ? ? Cat c = (Cat)a;? ? ? ? // 向下轉(zhuǎn)型? ? ? ?
? ? ? ? ?c.work();? ? ? ? // 調(diào)用的是 Cat 的 work? }?
? ? public static void show(Animal a)? {? ? ?
? ? ? ? ? ? ? ? ? a.eat();?
? ? ? ? ? ? ? ? // 類型判斷? ??
? ? ? ? ? ? ?if (a instanceof Cat)? {? // 貓做的事情? ? ? ?
? ? ? ? ? ? ? Cat c = (Cat)a;?
? ? ? ? ? ? ? ?c.work();?
? ? ? ? } else if (a instanceof Dog) { // 狗做的事情? ? ??
? ? ? ? ? ? ? ? Dog c = (Dog)a;?
? ? ? ? ? ? ? ? c.work();?
? ? ? ? }?
? ? }?
?}?
abstract class Animal {?
? ? ? ? ?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("看家");?
? ? }? }
多態(tài)的實(shí)現(xiàn)方式
方式一:重寫:
這個(gè)內(nèi)容已經(jīng)在上一章節(jié)詳細(xì)講過酥筝,就不再闡述滚躯,詳細(xì)可訪問:可以看小計(jì)2。
方式二:接口
1. 生活中的接口最具代表性的就是插座嘿歌,例如一個(gè)三接頭的插頭都能接在三孔插座中掸掏,因?yàn)檫@個(gè)是每個(gè)國家都有各自規(guī)定的接口規(guī)則,有可能到國外就不行宙帝,那是因?yàn)閲庾约憾x的接口類型丧凤。
2. java中的接口類似于生活中的接口,就是一些方法特征的集合步脓,但沒有方法的實(shí)現(xiàn)愿待。
方式三:抽象類和抽象方法