構造器內部的多型方法行為

2021-07-11 03:04:06 字數 766 閱讀 5828

package com.lu.test;

import static lu.utils.print.*;

/** 在任何構造器內部,整個物件可能只是部分形成——我們只知道基類物件已經進行初始化。

* 如果構造器只是在構建物件過程中的乙個步驟,並且該物件所屬的類是從這個構造器所屬

* 的類匯出的,那麼匯出部分在當前構造器正在被呼叫的時刻仍舊是沒有被初始化的。然而,

* 乙個動態繫結 的方法呼叫卻會向外深入到繼承層次結構內部,他可以呼叫匯出類的方法。

* 如果我們在構造器內部這麼做,那麼就可能會呼叫某個方法,而這個方法所操作的成員可

* 能還未進行初始化。*/

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

觀察:glyph.draw() 方法將要被覆蓋,這種覆蓋是在roundglyph中發生的。但是glyph構造器會呼叫這個方法,結果導致了對roundglyph.draw()的呼叫。

但是,當glyph的構造器呼叫draw()方法時,radius不是預設初始值1,而是0.

構造器內部多型方法的行為

如果在超類的構建器中呼叫了子類覆蓋過的方法,則編譯器缺省會呼叫在超類構建的過程中呼叫已經被子類覆蓋過的方法,而不是超類中的原始方法。這種錯誤很難從邏輯上進行排查,所以一定要格外小心!以下是例子 class glyph glyph class roundglyph extends glyph void...

構造器內部的多型方法的行為

下圖為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...