java構造器內部的多型方法

2021-08-27 19:21:46 字數 1098 閱讀 3306

我們知道,動態繫結的呼叫是在執行時才決定的,物件無法知道到底呼叫的是哪個類的方法。

當我們在構造器中呼叫動態繫結的方法,就會用到該方法被覆蓋之後的定義。但是這種呼叫的效果難以預計,因為被覆蓋的方法在物件被完全構造之前就會被呼叫。我們先來看看下面這段**:

class base 

public void tellname()

public void printname(string name)

} class drived extends base

public void tellname()

public void printname(string name)

} public class testobject

}

從**中可以看出,子類derived覆蓋了父類base的方法。當我們例項化乙個derived物件的時候,會自動呼叫父類的構造器,而父類構造器中卻呼叫了動態繫結方法

tellname();

這樣一來,在父類構造器中就會呼叫子類的tellchild()方法。此時父類base已完成初始化。。由於此時子類derived還沒有完成初始化,其實例變數name為預設為null。然後父類構造器退出,回到子類構造器呼叫處,然後完成子類初始化,接下來子類構造器呼叫完成。

**的執行結果如下;

tellchild null

printchild base

tellchild drived

printchild drived

實際的初始化過程應該是這樣的:

1. 在其他任何事物發生之前,將分配給物件的儲存空間初始化為二進位制的零。

2. 如上文一般,呼叫父類構造器,在父類構造器中會呼叫被子類覆蓋的方法(如果有在構造器中呼叫了動態繫結的方法)。

3. 按照宣告的順序呼叫成員的初始化方法。

4. 呼叫子類的構造器。

從上例可以看出,在構造器中能安全呼叫的方法是不能被繼承的,即該方法被final修飾,或者方法是private的(private方法自動屬於是final的,嘿嘿)。

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

package polymorphism class glyph void draw glyph class roundglyph extends glyph void draw public class polyconstructor 結果 static glyph glyph before dr...

構造器內部的多型方法

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

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

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