如果在超類的構建器中呼叫了子類覆蓋過的方法,則編譯器缺省會呼叫在超類構建的過程中呼叫已經被子類覆蓋過的方法,而不是超類中的原始方法。這種錯誤很難從邏輯上進行排查,所以一定要格外小心!以下是例子:
class glyph
glyph()
}class roundglyph extends glyph
void draw()
}public class polyconstructors
}/*output
glyph () before draw()
roundglyph.draw().radius = 0
glyph () after draw()
roundglyph.roundglyph().radius = 5
*/
我們本來應該得到的draw()方法應該是超類未被覆蓋的draw()方法,然而編譯器呼叫的卻是子類中的draw()方法。而此時子類構建器還未初始化,但是在例項已經給物件的儲存空間初始化成二進位制的0,所以看到radius為0而不是1 。 構造器內部的多型方法行為
package com.lu.test import static lu.utils.print.在任何構造器內部,整個物件可能只是部分形成 我們只知道基類物件已經進行初始化。如果構造器只是在構建物件過程中的乙個步驟,並且該物件所屬的類是從這個構造器所屬 的類匯出的,那麼匯出部分在當前構造器正在被呼...
構造器內部的多型方法的行為
下圖為tkj p163的程式,看書的時候一直不怎麼理解他的執行結果。自己一步步debugger得到結果。在程式開始執行的時候,由於roundglyph是glyph的子類,他會在構造器中首先呼叫父類的構造器,也就是進入到glyph的構造器方法中。在glyph中也有draw方法,並且在構造方法中呼叫了。...
構造器內部的多型方法的行為
public class livingcreature void draw public class animal extends livingcreature override void draw public static void main string args 結果 before draw...