構造器內部的多型方法

2021-08-20 05:49:34 字數 809 閱讀 5742

提出問題:已知b類繼承於a類,且b類複寫了a類中公共的非靜態的function()方法。且在a類的構造器中,呼叫function()方法。我們知道,在建立b類例項物件的時候,會呼叫a類的構造器方法。那麼,呼叫的是b類例項物件的function()方法,還是a類例項的function()方法?

首先,看乙個例項:

class glyph 

void draw()

}class roundglyph extends glyph

void draw()

}public class polyconstructors

}

父類glyph有非靜態方法draw(), 子類roundglyph複寫了draw()方法。且父類glyph構造器中呼叫了draw()方法。

分析:1. 在呼叫glyph構造器時,子類物件roundglyph還未生成。但是,這裡的draw()方法依然屬於動態繫結方法(即後期繫結),所以呼叫的還是子類的draw()方法,不是父類的

2. 在其他事物發生之前,將分配給物件的儲存空間初始化為二進位制的零,在本例中,雖然子物件roundglyph還沒有構建成功,但是,其非靜態成員變數,會初始為0,不是1(1是後期進行子類初始化的時候才賦的值,但此時子類物件尚未初始化)

執行結果:

glyph() before draw()

roundglyph.draw().radius = 0

glyph() after draw()

roundglyph.roundglyph().radius = 5

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

package com.lu.test import static lu.utils.print.在任何構造器內部,整個物件可能只是部分形成 我們只知道基類物件已經進行初始化。如果構造器只是在構建物件過程中的乙個步驟,並且該物件所屬的類是從這個構造器所屬 的類匯出的,那麼匯出部分在當前構造器正在被呼...

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

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

java構造器內部的多型方法

我們知道,動態繫結的呼叫是在執行時才決定的,物件無法知道到底呼叫的是哪個類的方法。當我們在構造器中呼叫動態繫結的方法,就會用到該方法被覆蓋之後的定義。但是這種呼叫的效果難以預計,因為被覆蓋的方法在物件被完全構造之前就會被呼叫。我們先來看看下面這段 class base public void tel...