類的初始化和例項的初始化

2021-09-22 20:12:49 字數 1923 閱讀 7275

有如下兩個類

father  (父類)

package com.yzx.test01;

/** * 父類物件

*父類初始化*(1) j=method();(5)

*(2) 父類的靜態**塊(1)

* * 父類的例項化方法:

* (1)super() (最前)

* (2)i=test();

* (3)父類的非靜態**塊

* (4)父類的無參構造(最後)

* * 非靜態方法前面其實有乙個預設物件this

* this在構造器《或init>它表示正在建立物件,因為這裡是在建立son物件

* 所以test()執行的是子類重寫的**(物件導向多型)

* * 哪些方法不能被重寫:

* final 方法

* 靜態方法

* private 等子類中不可見的方法

* * 物件的多型性

* 子類如果重寫了父類的方法 通過子類呼叫的一定是子類重寫過的**

* 非靜態預設的呼叫物件是this

* this物件在構造器或者說方法中就是正在建立的物件

* * 類初始化過程:

* (1)乙個類要建立例項需要先載入並且初始化該類

* main 方法所在的類需要優先載入和初始化

* (2)乙個子類要初始化需要先初始化父類

* (3)

* 乙個類初始化就是執行* ()方法由靜態變數顯示賦值**和靜態**塊組成

* 類變數顯示賦值**和靜態**塊顯示賦值從上到下順序指向

* ()方法只執行一次

* */

public class father

//構造器

public father()

public int test()

public static int method()

}

son 子類 子類繼承父類father

package com.yzx.test01;

/** * 子類初始化* (1) j =method();(10)

* (2)子類靜態**塊(6)

* * 先初始化父類:(5)(1)(10)(6)

* * 子類的例項化方法 :

* (1)super() (最前) (9) (3) (2)

* (2)i=test(); (9)

* (3)子類的非靜態**塊(8)

* (4)子類的無參構造(最後)(7)

* * 因為建立了兩個son物件

* 所以方法執行了兩次

* (9)(3)(2)(9)(8)(7)

* *

* */

public class son extends father

//構造器

public son()

public int test()

public static int method()

public static void main(string args)

}

列印結果:(5)(1)(10)(6)(9)(3)(2)(9)(8)(7)

(9)(3)(2)(9)(8)(7)

分析:類初始化過程:

(1)靜態變數顯示賦值**

(2)靜態**塊

類例項化過程:

(1)super() 一定在最前

(2)類賦值語句

(3)類非靜態**塊

(4)類的無參構造(最後)

特別:* 物件的多型性

* 子類如果重寫了父類的方法 通過子類呼叫的一定是子類重寫過的**

* 非靜態預設的呼叫物件是this

* this物件在構造器或者說方法中就是正在建立的物件

類初始化和例項初始化

乙個類要建立例項需要先載入並初始化該類 main方法所在的類需要先載入和初始化 乙個子類要初始化需要先初始化父類 乙個類初始化就是執行clinit 方法 clinit 方法由靜態類變數顯式賦值 和靜態 塊組成 類變數顯式賦值 和靜態 塊 從上到下順序執行 clinit 方法只執行一次 父類的初始化 ...

類初始化和例項初始化

father public class father father public inttest public static intmethod son public class sonextends father son public inttest public static intmethod...

類的初始化和例項的初始化

執行結果 一 初始main方法所在的類,有父類先初始化父類,初始屬性和構造方法,執行順序與 順序一致 5 1 10 6 二 物件son初始化 1 呼叫super 載入父類f非靜態的物件,屬性與 塊按順序,構造器最後執行,順序如下 i test 實際執行子類重寫的物件 9 呼叫父類非靜態 塊 3 載入...