教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

Java培訓(xùn)之java難點解析(九)-多態(tài)

更新時間:2016年03月15日10時39分 來源:傳智播客Java培訓(xùn)學(xué)院 瀏覽次數(shù):

多 態(tài)★★★★★(面向?qū)ο筇卣髦唬汉瘮?shù)本身就具備多態(tài)性,某一種事物有不同的具體的體現(xiàn)。
 
體現(xiàn):父類引用或者接口的引用指向了自己的子類對象。//Animal a = new Cat();
多態(tài)的好處:提高了程序的擴(kuò)展性。
多態(tài)的弊端:當(dāng)父類引用指向子類對象時,雖然提高了擴(kuò)展性,但是只能訪問父類中具備的方法,不可以訪問子類中特有的方法。(前期不能使用后期產(chǎn)生的功能,即訪問的局限性)
多態(tài)的前提:
1:必須要有關(guān)系,比如繼承、或者實現(xiàn)。
2:通常會有覆蓋操作。
 
在java培訓(xùn)實戰(zhàn)當(dāng)中,多態(tài)的出現(xiàn)思想上也做著變化:以前是創(chuàng)建對象并指揮對象做事情。有了多態(tài)以后,我們可以找到對象的共性類型,直接操作共性類型做事情即可,這樣可以指揮一批對象做事情,即通過操作父類或接口實現(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.看電影();  //錯誤.
畢老師 y = (畢老師)x; //將畢姥爺類型強(qiáng)制轉(zhuǎn)換成畢老師類型。 
y.看電影();//在多態(tài)中,自始自終都是子類對象在做著類型的變化。
}
}
---------------------------------------------------------------
java培訓(xùn)實戰(zhàn)項目中如果想用子類對象的特有方法,如何判斷對象是哪個具體的子類類型呢?
可以可以通過一個關(guān)鍵字 instanceof ;//判斷對象是否實現(xiàn)了指定的接口或繼承了指定的類
 
格式:<對象 instanceof 類型> ,判斷一個對象是否所屬于指定的類型。
Student instanceof Person = true;//student繼承了person類
 
多態(tài)在子父類中的成員上的體現(xiàn)的特點:
1,成員變量:在多態(tài)中,子父類成員變量同名。
在編譯時期:參考的是引用型變量所屬的類中是否有調(diào)用的成員。(編譯時不產(chǎn)生對象,只檢查語法錯誤)
運行時期:也是參考引用型變量所屬的類中是否有調(diào)用的成員。
簡單一句話:無論編譯和運行,成員變量參考的都是引用變量所屬的類中的成員變量。
再說的更容易記憶一些:成員變量 --- 編譯運行都看 = 左邊。
2,成員函數(shù)。
編譯時期:參考引用型變量所屬的類中是否有調(diào)用的方法。
運行事情:參考的是對象所屬的類中是否有調(diào)用的方法。
為什么是這樣的呢?因為在子父類中,對于一模一樣的成員函數(shù),有一個特性:覆蓋。
簡單一句:成員函數(shù),編譯看引用型變量所屬的類,運行看對象所屬的類。
更簡單:成員函數(shù) --- 編譯看 = 左邊,運行看 = 右邊。
3,靜態(tài)函數(shù)。 
編譯時期:參考的是引用型變量所屬的類中是否有調(diào)用的成員。
運行時期:也是參考引用型變量所屬的類中是否有調(diào)用的成員。
為什么是這樣的呢?因為靜態(tài)方法,其實不所屬于對象,而是所屬于該方法所在的類。
調(diào)用靜態(tài)的方法引用是哪個類的引用調(diào)用的就是哪個類中的靜態(tài)方法。
簡單說:靜態(tài)函數(shù) --- 編譯運行都看 = 左邊。
-----------------------------------------------------------------------------------------------
------java.lang.Object
Object:所有類的直接或者間接父類,Java認(rèn)為所有的對象都具備一些基本的共性內(nèi)容,這些內(nèi)容可以不斷的向上抽取,最終就抽取到了一個最頂層的類中的,該類中定義的就是所有對象都具備的功能。
 
具體方法:
1,boolean equals(Object obj):用于比較兩個對象是否相等,其實內(nèi)部比較的就是兩個對象地址。
而根據(jù)對象的屬性不同,判斷對象是否相同的具體內(nèi)容也不一樣。所以在定義類時,一般都會復(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():獲取任意對象運行時的所屬字節(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://metathetuscanyresort.com/javaee 
0 分享到:
和我們在線交談!