什么是多態?
簡單的說,就是用父類的引用指向子類的對象。多態可以理解成“一個接口,多種實現”,就是同一種事物表現出的多種形態,多態允許將子類的對象當作父類的對象使用,某父類型的引用指向其子類型的對象,調用的方法是該子類型的方法。
多態的作用?
把不同的子類對象都當作父類來看,可以屏蔽不同子類對象之間的差異,寫出通用的代碼,做出通用的編程,以適應需求的不斷變化。
看下面的例子,程序員還是比較喜歡用代碼來說明問題
舉個例子,針對中國軍人打日本鬼子這件事,用我們程序來實現的話就是這樣:
假如現在是1900年,中華民族的軍人是用大刀來殺敵的,按照OO的思想,我們會抽象出來兩個個類,一個表示大刀,一個表示軍人,即軍人用大刀殺敵;其中,武器有個kill()方法,表示殺日本鬼子,軍人有個方法是用大刀來戰斗。我們的實現方式是這樣:

public class SWord { public void kill() { System.out.); }}public class Soldier { public void fight(Sword sword) { sword.kill(); } public static void main(String args[]) { Soldier soldier = new Soldier(); Sword sword = new Sword(); soldier.fight(sword); }}
如果你寫出這樣的代碼的話,恭喜你!你中大獎了!---------------------你會被項目經理砍死的!!!!!!!
項目經理為什么會砍你呢?
因為你寫的代碼偶合性太強了!
想一想,
如果我們的需求變了,日本鬼子1939年又來侵略中國了,那么我們的戰士該怎么辦啊,總不能像以前一樣拿著大刀跟人家打仗吧,那樣的話抗日戰爭會不會到現在還沒結束呢?!
所以到我們程序這兒,以前的系統怎么辦啊.因此不要指望你作的系統永遠不會變化
我們的系統只能修改!這就是項目經理砍你的原因
我們的系統會增加一個槍支類,也有個kill()方法

public class Gun{ public void kill(){ System.out.println("把子彈射入日本鬼子的頭顱!"); }}
我們的核心業務類Soldier也要升級

public class Soldier { /* public void fight(Sword sword){ sword.kill(); } */ public void fight(Gun gun) { gun.kill(); } public static void main(String args[]) { Soldier soldier = new Soldier(); // Sword sword= new Sword (); // soldier.fight(sword); Gun gun = new Gun(); soldier.fight(gun); }}
這樣做是不是耦合性太強了?以后的情況,我們可以把大刀和槍等作為武器抽象出來:

public abstract class Weapon { public void kill();// 讓子類來運行}public Sword extends Weapon{ @Override public void kill() { System.out.println("大刀向日本鬼子的頭上砍去!"); }}public Gun extends Weapon{ @Override public void kill() { System.out.println("把子彈射入日本鬼子的頭顱!); }}public class Soldier { private Weapon weapon; public Soldier(){} public Soldier(Weapon weapon){ this.weapon = weapon; } public void setWeapon(Weapon weapon){ this.weapon = weapon; } public void fight() { weapon.kill(); } public static void main(String args[]) { Soldier soldier = new Soldier(); Weapon sword= new Sword (); soldier.setWeapon(sword); soldier.fight();//1900年用大刀殺敵 Weapon gun = new Gun(); soldier.setWeapon(gun); soldier.fight();//1939年用小米加步槍殺敵 }}
多態可以用在什么地方呢?
可以用在方法的參數中和方法的返回類型中。
其中多態用于方法參數時上面給出了代碼.我這里給出在方法的返回類型中如何使用多態。
上面的例子中,不管是Sword還是Gun都是我們自己直接new出來的.我們可以設計一個工廠類,專門生成武器

public class WeaponFactory { public Weapon createWeapon(String year) { if (year.equals("1900")) { return new Sword(); } else if (year.equals("1939")) { return new Gun(); } else { return null; } }}public class Soldier { private Weapon weapon; public Soldier(){} public Soldier(Weapon weapon){ this.weapon = weapon; } public void setWeapon(Weapon weapon){ this.weapon = weapon; } public void fight() { weapon.kill(); } public static void main(String args[]) { Soldier soldier = new Soldier(); WeaponFactory weaponFactory = new WeaponFactory(); Weapon sword= weaponFactory.createWeapon("1900"); soldier.setWeapon(sword); soldier.fight();//1900年用大刀殺敵 Weapon gun= weaponFactory.createWeapon("1939"); soldier.setWeapon(gun); soldier.fight();//1939年用小米加步槍殺敵 }}
這實際上就是設計模式中的簡單工廠模式!
另外,我我們在JDK中可以大量的看到多態的應用,比如在Object類中的equals(Object obj)方法中,參數是個Object
類型的參數.因為Object是java中所有類的基類.,但是才傳入參數的時候,可以傳入任何一個類的對象
這就是多態的應用!
使用多態可以解決項目中緊偶合的問題,提高程序的課擴展性.是OCP原則的一個具體的實現
新聞熱點
疑難解答