在多型性中有這樣乙個問題,如果在乙個構造器的內部呼叫正在構造的物件的某個動態繫結方法(在父類構造器中呼叫子類覆寫的方法),會發生什麼情況?
在一般的方法內部,動態繫結的呼叫是執行時才決定的,因為物件不知道它是屬於方法所在的類還是所在類的衍生子類。如果在構造器內部呼叫乙個動態繫結的方法,那麼就會用到這個方法被覆寫後的例項。
通過例項**來看一下
public
class
ployconstructors
}class
glyph
glyph()
}class
roundglyph
extends
glyph
//通常情況下子類覆寫父類方法獲得多型性
@override
void draw()
}
其執行輸出是
glyph before draw()
roundglyph.draw(),radius 0
glyph after draw()
roundglyph.roundglyph,radius 4
顯然的,上面發生了我們不希望看見的結果,呼叫draw()方法輸出了乙個既不是1也不是4的值,這個值是未知的。
我們需要知道的是初始化的實際過程
1.儲存空間被分配出來準備建立乙個類例項,儲存空間被初始化為0
2.呼叫父類構造器,初始化父類物件,這時會呼叫被覆蓋的draw()方法,由於步驟1,此時radius=0
3.呼叫成員的初始化部分
4.呼叫子類的構造器
因為構造器內部的多型方法的行為特點,所以使用除了不會被覆寫的final方法,我們在構造器中應該避免一些呼叫將來有可能被覆寫的方法甚至不要呼叫任何方法.
構造器內部的多型方法
提出問題 已知b類繼承於a類,且b類複寫了a類中公共的非靜態的function 方法。且在a類的構造器中,呼叫function 方法。我們知道,在建立b類例項物件的時候,會呼叫a類的構造器方法。那麼,呼叫的是b類例項物件的function 方法,還是a類例項的function 方法?首先,看乙個例項...
構造器內部的多型方法行為
package com.lu.test import static lu.utils.print.在任何構造器內部,整個物件可能只是部分形成 我們只知道基類物件已經進行初始化。如果構造器只是在構建物件過程中的乙個步驟,並且該物件所屬的類是從這個構造器所屬 的類匯出的,那麼匯出部分在當前構造器正在被呼...
構造器內部多型方法的行為
如果在超類的構建器中呼叫了子類覆蓋過的方法,則編譯器缺省會呼叫在超類構建的過程中呼叫已經被子類覆蓋過的方法,而不是超類中的原始方法。這種錯誤很難從邏輯上進行排查,所以一定要格外小心!以下是例子 class glyph glyph class roundglyph extends glyph void...