Java多型時類的載入順序

2021-08-14 22:53:58 字數 1272 閱讀 3848

public

class base

public

void

callname()

static class sub extends base

}public

static

void

main(string args)

}

輸出是什麼:

a. null

b. base

c. sub

1.首先,需要明白類的載入順序。

(1) 父類靜態**塊(包括靜態初始化塊,靜態屬性,但不包括靜態方法)

(2) 子類靜態**塊(包括靜態初始化塊,靜態屬性,但不包括靜態方法 )

(3) 父類非靜態**塊( 包括非靜態初始化塊,非靜態屬性 )

(4) 父類建構函式

(5) 子類非靜態**塊 ( 包括非靜態初始化塊,非靜態屬性 )

(6) 子類建構函式

其中:類中靜態塊按照宣告順序執行,並且(1)和(2)不需要呼叫new類例項的時候就執行了(意思就是在類載入到方法區的時候執行的)

2.其次,需要理解子類覆蓋父類方法的問題,也就是方法重寫實現多型問題。

base b = new sub();它為多型的一種表現形式,宣告是base,實現是sub類, 理解為 b 編譯時表現為base類特性,執行時表現為sub類特性。

當子類覆蓋了父類的方法後,意思是父類的方法已經被重寫,題中 父類初始化呼叫的方法為子類實現的方法,子類實現的方法中呼叫的basename為子類中的私有屬性。

base b = new

sub();

類的載入

1.1 父類的靜態**塊:無;

1.2 子類的靜態**塊:無;

類的初始化

2.1 初始化父類物件:

2.1.1 父類的非靜態**塊:private string basename = 「base」;

2.1.2 父類的建構函式:呼叫 callname 方法;由於 callname 方法被子類重寫,所以呼叫的是子類的 callname 方法;而此時子類的非靜態**塊還沒有開始執行,也就是 private string basename = 「sub」 沒有執行,所以這一步列印出來的字串是 null;

2.2 初始化子類物件:

2.2.1 子類的非靜態**塊:private string basename = 「sub」;

2.2.2 子類的建構函式:預設

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...

Java 類載入順序

父類 靜態成員變數 父類 static 塊 子類 靜態成員變數 本類 static 塊 父類 構造塊 父類 預設構造方法 子類 構造塊 子類 有參 構造方法。package com.example.demo.basic author grace.pan date 2019 6 17 public c...