轉帖|其它|編輯:郝浩|2010-08-16 09:55:31.000|閱讀 760 次
概述:該文內容為本人學習Java核心編程第七版時做的學習總結以及一些理解,介紹多態與動態綁定。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
該文內容為本人學習Java核心編程第七版時做的學習總結以及一些理解,部分內容為翻譯過來的。 1. 多態(polymorphism) 在面向對象的編程里面,多態是一個出現頻率比較高的術語,那么多態到底是指什么 呢?一個對象變量(objectvariable,與基本數據類型的變量相對應)可以指向(referto)多個類型的對象,這就是多態。以下面的代碼為例:
publicclassPolymorphicTest{
publicPolymorphicTest(){
}
publicvoidsetName(Stringn){
this.name=n;
//www.mscto.com
System.out.println(“在父類中”);
} publicStringgetName()
{
returnthis.name;
}
privateStringname;
}
publicclassPolymorphicChildextendsPolymorphicTest{
publicvoidsetArea(Stringa){
this.area=a;
}
publicStringgetArea(){
}
//publicvoidsetName(Stringn){
// super(“n”);
// System.out.pirngln(“在子類中”);
// } publicstaticvoidmain(String[]args){
PolymorphicChildchild=newPolymorphicChild();
PolymorphicTesttest[]=newPolymorphicTest[2];
test[0]=child;
test[0].setName(“zhukai”);
test[1]=newPolymorphicTest(); //www.mscto.com
}
privateStringarea; //www.mscto.com
}
test[0]聲明為一個PolymorphicTest的變量,但是它可以referto一個PolymorphicChild類型的對象(如child),當然它也肯定可以referto一個PolymorphicTest類型的對象,因為它本身就是這個類型的,例如test[1]。為什么會這樣呢?一般來說,一個對象變量可以指向(referto)任意一個它自己所屬類型及其子類型的對象,有一個有名的(is-a)規則,類似于我國古代的“白馬非馬”這個典故。它就是說,任何一個子類的對象都可以說成是其父類的一個對象,但是反之則不一定了,例如,我們可以說白馬是馬,但是不能說馬是白馬。這個規則的另外一個表示方法就是“替換”準則:凡是程序中需要用到父類對象的地方,我們都可以用其子類的對象來進行替換。
接下來,就產生了一個問題,我們調用test[0]的setName(Stringn)方法的時候,它調用的到底是PolymorphicTest類還是PolymorphicChild類的setName方法呢?這就涉及到動態綁定的問題了,對象如何自動的選擇合適的方法來執行?
2. 動態綁定(DynamicBinding) 以上一節中的test[0].setName(Stringn)為例,我們現在有語句test[0].setName(“zhukai”),
那么它的執行過程是什么樣的呢?
第一步:查看test[0]聲明的類型,即PolymorphicTest類,然后獲得方法名setName,接著把PolymorphicTest類中的所有名字為setName的方法以及其父類中所有名字為setName的public方法列出來。若沒有名為setName的方法,則調用失敗,否則轉第二步。
第二步:根據所調用方法的參數類型來對上一步所列出來的所有方法進行匹配,直到找到一個匹配的轉第三步,如果沒有匹配則調用失敗。
第三步:若test[0]所指向(referto)的對象的類型為其一個子類,則需查看子類有沒有覆蓋該方法,若有,則執行子類中的方法。
注1:如果這個方法是private或者static或者final類型的,就不用進行動態綁定了,因為編譯器可以很準確的知道要調用哪個方法。
注2:查詢匹配方法時,是按照繼承樹逐級向上查找,直到找到第一個匹配的。
以上就是動態綁定的過程。
以上面的程序為例,程序執行時,當執行test[0].setName(“zhukai”)時,將會輸出“在父類中”,如果去掉PolymorphicChild中的注釋,此時將會先輸出“在父類中”,然后再輸出“在子類中”。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:網絡轉載