java基礎 繼承關係類載入順序問題

2021-08-01 21:08:11 字數 2292 閱讀 6546

/**

* created by fei on 2017/5/31.

*/public

class

sonclass

extends

parentclass

static

public

static

void

main(string args)

}class parentclass

static

}

執行結果:

parentclass's static block 

sonclass's static

block

------ main start ------

parentclass's block

parentclass's constructor

sonclass's

block

sonclass's

constructor

------ main

end ------

根據執行結果,一目了然,在執行 main 方法中 new sonclass() 之前,就在類載入之後執行了類中 static **塊。然後再進入main方法,執行new操作,當然顯而易見,在執行new子類操作的時候,是要先進行其父類的構造,即先執行父類的構造**塊(**中只用大括號包裹的那段**)以及建構函式 ,然後再執行子類的構造**塊以及建構函式。

修改一下**,再來看看執行的結果:

/**

* created by fei on 2017/5/31.

*/public

class

sonclass

extends

parentclass

public

sonclass(string name)

public

static

void

main(string args)

}class parentclass

public

parentclass(string name)

}

執行的順序是:

------ main start ------ 32

4------ main end ------

總之,一句話:子類沒有顯示呼叫父類建構函式,不管子類建構函式是否帶引數都預設呼叫父類無參的建構函式,若父類沒有則編譯出錯。

還是兩個類,我們再更改一下。

/**

* created by fei on 2017/5/31.

*/public

class

sonclass

extends

parentclass

public

void

printname()

public

static

void

main(string args)

}class parentclass

public

void

printname()

}

看了上面的兩個例子,最後這個例子就很容易被迷惑,可能有人會覺得執行結果是類似這樣的:

parentclass print name: parentclass 

sonclass print name: sonclass

或者是:

parentclass print name: sonclass

sonclass print name: sonclass

但真正的結果是這樣的:

sonclass print name: null

sonclass print name: sonclass

為什麼會這樣,其實只要開啟**中父類構造器中的這句注釋,就很容易理解了:system.out.println(this.getclass())

結果是:

class

sonclass

沒錯,父類中的this引用是子類例項物件,所以在父類建構函式裡呼叫的還是子類的printname()方法。具體原因也並我能十分肯定,我個人淺見,是因為雖然我們呼叫了父類的構造方法,但是我們並沒有例項化出父類的例項物件,所以this還是指向的是子類的引用。

java 繼承類載入順序

package xu.jin class insect static static int print string str static int x1 print static insect class hello extends insect static public static void ...

java類載入順序

1 父類靜態成員和靜態初始化塊,按在 中出現的順序依次執行。2 子類靜態成員和靜態初始化塊,按在 中出現的順序依次執行。3 父類例項成員和例項初始化塊,按在 中出現的順序依次執行。4 執行父類構造方法。5 子類例項成員和例項初始化塊,按在 中出現的順序依次執行。6 執行子類構造方法。下面提供了有關靜...

java類載入順序

package com.demo description 類載入順序 author fujianyong 2015 2 6上午11 21 37 public class classloadersequence public static void test1 public void test2 pu...