多態就是指對象的多種形態。一個是引用的多態;一個是方法的多態。
當我們在寫面向對象程序的時候,一般父類的引用可以指向本類的對象。
Animal a = new Animal(); //a是父類的引用指向的是本類的對象Animal b = new Dog(); //b是父類的引用指向的是子類的對象//注意:我們不能使用一個子類的引用去指向父類的對象 多態中,可以使用父類的引用指向子類的對象,如上面代碼里的對象b
,那b
究竟是代表 Dog 類還是代表Animal
類呢?
2、方法多態
一般情況下,我們都是用本類的對象,調用本類的方法。在多態中,創建子類對象時,調用的方法為子類重寫的方法或繼承的方法。
Animal a = new Animal(); //a是父類的引用指向的是本類的對象Animal b = new Dog(); //b是父類的引用指向的是子類的對象//這邊是引用的多態a.bark(); //調用的是父類Animal的方法b.bark(); //調用的是子類Dog重寫的方法//這便是方法的多態注意:
父類引用指向子類對象時不可以調用子類獨有的方法,只能調用繼承或重寫的方法引用多態不能使用一個子類的引用去指向父類的對象多態引用類型轉換
在我們使用多態時,經常會用到引用類型轉換。引用類型轉換有兩種。
一種引用類型轉換是向上類型轉換(隱式/自動類型轉換)
,是小類型到大類型的轉換(無風險)。另一種是向下類型轉換(強制類型轉換)
,是大類型到小類型(有風險)。
比如一杯水,我們倒進壺里,這種向上轉換是不存在風險的,計算機可以自動幫我們完成,所以向上類型轉換
又叫做自動類型轉換
或隱式類型轉換
。而如果我們想將壺里的水倒進杯子里,就可能會產生溢出,這是有風險的。計算機是不會自動完成這樣的操作。但如果程序猿想要完成這樣的操作,就只能強制轉換。所以向下類型轉換
又叫做強制類型轉換
。
例如:
Dog a = new Dog();Animal b = a; //自動類型提升 向上類型轉換(無風險)/*Dog c = b; //將父類引用轉換成子類引用,編譯器不允許這樣做*/Dog c = (Dog)b; //在父類前加上小括號,里面加上子類類型,實現強制轉換//向下類型轉換/*Cat d = (Cat)b;//雖然編譯器不會報錯,但運行會出問題,因為b是指向Dog類的,它們是不同類型的對象,這里就存在風險/*抽象類
抽象類在定義類時,前面會加abstract
關鍵字。那我們什么時候會用到抽象類呢?
在某些情況下,某個父類只是知道其子類應該包含怎樣的方法,但無法準確知道這些子類如何實現這些方法。也就是說抽象類是約束子類必須要實現哪些方法,而并不關注方法如何去實現。
從多個具有相同特征的類中抽象出一個抽象類,以這個抽象類作為子類的模板,從而避免了子類設計的隨意性。
所以由上可知,抽象類是限制規定子類必須實現某些方法,但不關注實現細節。
那抽象類如何用代碼實現呢,它的規則如下:
用 abstract 修飾符定義抽象類
用 abstract 修飾符定義抽象方法,只用聲明,不需要實現
包含抽象方法的類就是抽象類
抽象類中可以包含普通的方法,也可以沒有抽象方法
抽象類的對象不能直接創建,我們通常是定義引用變量指向子類對象。
1、先創建一個抽象類

2、 填寫需要子類實現的抽象方法
package com.shiyanlou;//抽象方法public abstract class TelePhone { public abstract void call(); //抽象方法,打電話 public abstract void message(); //抽象方法,發短信}3、構建子類,并實現抽象方法。
package com.shiyanlou;public class CellPhone extends TelePhone { @Override public void call() { // TODO Auto-generated method stub System.out.PRintln("我可以打電話!"); } @Override public void message() { // TODO Auto-generated method stub System.out.println("我可以發短信!"); }}
|
新聞熱點
疑難解答