多 態(tài)★★★★★(面向?qū)ο筇卣髦唬汉瘮?shù)本身就具備多態(tài)性,某一種事物有不同的具體的體現(xiàn)。
體現(xiàn):父類引用或者接口的引用指向了自己的子類對象。//Animal a = new Cat();
多態(tài)的好處:提高了程序的擴(kuò)展性。
多態(tài)的弊端:當(dāng)父類引用指向子類對象時(shí),雖然提高了擴(kuò)展性,但是只能訪問父類中具備的方法,不可以訪問子類中特有的方法。(前期不能使用后期產(chǎn)生的功能,即訪問的局限性)
多態(tài)的前提:
1:必須要有關(guān)系,比如繼承、或者實(shí)現(xiàn)。
2:通常會有覆蓋操作。
在java培訓(xùn)實(shí)戰(zhàn)當(dāng)中,多態(tài)的出現(xiàn)思想上也做著變化:以前是創(chuàng)建對象并指揮對象做事情。有了多態(tài)以后,我們可以找到對象的共性類型,直接操作共性類型做事情即可,這樣可以指揮一批對象做事情,即通過操作父類或接口實(shí)現(xiàn)。
--------------------------------------------------------------
class 畢姥爺{
void 講課(){
System.out.println("企業(yè)管理");
}
void 釣魚(){
System.out.println("釣魚");
}
}
class 畢老師 extends 畢姥爺{
void 講課(){
System.out.println("JAVA");
}
void 看電影(){
System.out.println("看電影");
}
}
class {
public static void main(String[] args) {
畢姥爺 x = new 畢老師(); //畢老師對象被提升為了畢姥爺類型。
// x.講課();
// x.看電影(); //錯(cuò)誤.
畢老師 y = (畢老師)x; //將畢姥爺類型強(qiáng)制轉(zhuǎn)換成畢老師類型。
y.看電影();//在多態(tài)中,自始自終都是子類對象在做著類型的變化。
}
}
---------------------------------------------------------------
java培訓(xùn)實(shí)戰(zhàn)項(xiàng)目中如果想用子類對象的特有方法,如何判斷對象是哪個(gè)具體的子類類型呢?
可以可以通過一個(gè)關(guān)鍵字 instanceof ;//判斷對象是否實(shí)現(xiàn)了指定的接口或繼承了指定的類
格式:<對象 instanceof 類型> ,判斷一個(gè)對象是否所屬于指定的類型。
Student instanceof Person = true;//student繼承了person類
多態(tài)在子父類中的成員上的體現(xiàn)的特點(diǎn):
1,成員變量:在多態(tài)中,子父類成員變量同名。
在編譯時(shí)期:參考的是引用型變量所屬的類中是否有調(diào)用的成員。(編譯時(shí)不產(chǎn)生對象,只檢查語法錯(cuò)誤)
運(yùn)行時(shí)期:也是參考引用型變量所屬的類中是否有調(diào)用的成員。
簡單一句話:無論編譯和運(yùn)行,成員變量參考的都是引用變量所屬的類中的成員變量。
再說的更容易記憶一些:成員變量 --- 編譯運(yùn)行都看 = 左邊。
2,成員函數(shù)。
編譯時(shí)期:參考引用型變量所屬的類中是否有調(diào)用的方法。
運(yùn)行事情:參考的是對象所屬的類中是否有調(diào)用的方法。
為什么是這樣的呢?因?yàn)樵谧痈割愔?,對于一模一樣的成員函數(shù),有一個(gè)特性:覆蓋。
簡單一句:成員函數(shù),編譯看引用型變量所屬的類,運(yùn)行看對象所屬的類。
更簡單:成員函數(shù) --- 編譯看 = 左邊,運(yùn)行看 = 右邊。
3,靜態(tài)函數(shù)。
編譯時(shí)期:參考的是引用型變量所屬的類中是否有調(diào)用的成員。
運(yùn)行時(shí)期:也是參考引用型變量所屬的類中是否有調(diào)用的成員。
為什么是這樣的呢?因?yàn)殪o態(tài)方法,其實(shí)不所屬于對象,而是所屬于該方法所在的類。
調(diào)用靜態(tài)的方法引用是哪個(gè)類的引用調(diào)用的就是哪個(gè)類中的靜態(tài)方法。
簡單說:靜態(tài)函數(shù) --- 編譯運(yùn)行都看 = 左邊。
-----------------------------------------------------------------------------------------------
------java.lang.Object
Object:所有類的直接或者間接父類,Java認(rèn)為所有的對象都具備一些基本的共性內(nèi)容,這些內(nèi)容可以不斷的向上抽取,最終就抽取到了一個(gè)最頂層的類中的,該類中定義的就是所有對象都具備的功能。
具體方法:
1,boolean equals(Object obj):用于比較兩個(gè)對象是否相等,其實(shí)內(nèi)部比較的就是兩個(gè)對象地址。
而根據(jù)對象的屬性不同,判斷對象是否相同的具體內(nèi)容也不一樣。所以在定義類時(shí),一般都會復(fù)寫equals方法,建立本類特有的判斷對象是否相同的依據(jù)。ooo
public boolean equals(Object obj){
if(!(obj instanceof Person))
return false;
Person p = (Person)obj;
return this.age == p.age;
}
2,String toString():將對象變成字符串;默認(rèn)返回的格式:類名@哈希值 = getClass().getName() + '@' + Integer.toHexString(hashCode())
為了對象對應(yīng)的字符串內(nèi)容有意義,可以通過復(fù)寫,建立該類對象自己特有的字符串表現(xiàn)形式。
public String toString(){
return "person : "+age;
}
3,Class getClass():獲取任意對象運(yùn)行時(shí)的所屬字節(jié)碼文件對象。
4,int hashCode():返回該對象的哈希碼值。支持此方法是為了提高哈希表的性能。
通常equals,toString,hashCode,在應(yīng)用中都會被復(fù)寫,建立具體對象的特有的內(nèi)容。
本文版權(quán)歸傳智播客Java培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!
作者:傳智播客Java培訓(xùn)學(xué)院
首發(fā):http://xamj520.com/javaee