有如下兩個類
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 載入...