Java 父類子類初始化問題

2021-08-18 23:12:48 字數 1020 閱讀 3852

例子:

public

class

test8

extends

base

public

void

tellname()

public

void

printname()

public

static

void

main(string args)

}class base

public

void

tellname()

public

void

printname()

}

輸出結果:

name: null

dervied print name: null

dervied tell

name: dervied

dervied print name: dervied

分析:首先new test8()執行,初始化子類test8,然後因為test繼承了base,所以要先初始化base,進入base後先初始base的成員變數name,並賦值為base,然後進入bsse()構造方法後,執行tellname()方法,因為子類重寫了該方法,所以實際上執行的是子類的tellname()方法,但是這時子類還沒有初始化,所以子類的name欄位的值為null,因此輸出為null,同理printname()輸出也為null。當父類構造方法中的兩條語句執行完之後,開始子類初始化,將name賦值為dervied,然後執行子類的建構函式test8(),此時子類的name已經被賦值,所以子類構造方法中輸出的name不為null。

附:類初始化順序

父類靜態塊→子類靜態塊→父類初始化塊(成員變數,非靜態**塊等)→父類構造方法→子類初始化塊(成員變數,非靜態**塊等)→子類構造方法

Java中父類 子類初始化順序

測試結果 父類靜態 塊 子類靜態 塊 父類成員變數初始化parent common block test 父類有參構造方法ppp 子類成員變數初始化son common block test 子類有參構造方法ppp sss 靜態 塊只能生成一次 父類成員變數初始化parent common bloc...

父類,子類初始化 2

載入類時,先父類靜態,再子類靜態,然後是子類中main方法,main方法中如果有生成子類物件的語句,先找到子類建構函式,因為每個子類建構函式裡頭都會有super語句 jdk預設或者自己提供,且預設在建構函式中第一行 則先初始化父類非靜態,然後父類構造,再然後是子類非靜態,子類建構函式 除super之...

Java 父類子類的物件初始化過程

基本初始化過程 對於乙個簡單類的初始化過程是 static 修飾的模組 static變數和static 塊 按照 順序依次執行。例項變數 及非static模組 按照 順序依次執行。建構函式 執行對應的建構函式。子類的初始化過程。父類static修飾的模組 子類static修飾模組 父類例項變數和非s...