2.繼承情況下Java初始化順序
用代碼和輸出直接說明:
package com.kael;/** * * @Title:Demo004 * @Description: * @Copyright:Copyright (c) 2012 * @Date:2012-7-25 * @author feilong.li */public class Initialization {// 主函數public static void main(String str[]) {TA ta = new TA();System.out.println("-------------------------");TB tb = new TB();}}class MainTest {MainTest(String s) {System.out.println(s);}MainTest() {System.out.println("MainTest預設建構函式被調用");}}class TA {static MainTest mt = new MainTest("靜態成員mt初始化");MainTest mt1 = new MainTest("mt1成員初始化");static {System.out.println("static塊執行");mt = new MainTest("靜態塊內初始化sam成員變數");}TA() {System.out.println("TA預設建構函式被調用");}}class TB {static MainTest mainTest1 = new MainTest("靜態成員mainTest1初始化");static {System.out.println("static 塊 1 執行");}MainTest mt1 = new MainTest("mt1成員初始化");static MainTest mainTest2 = new MainTest("靜態成員mainTest2初始化");static {System.out.println("static 塊 2 執行");}TB() {System.out.println("TB預設建構函式被調用");}MainTest mt2 = new MainTest("mt2成員初始化");}
輸出結果:
靜態成員mt初始化
static塊執行
靜態塊內初始化sam成員變數
mt1成員初始化
TA預設建構函式被調用
-------------------------
靜態成員mainTest1初始化
static 塊 1 執行
靜態成員mainTest2初始化
static 塊 2 執行
mt1成員初始化
mt2成員初始化
TB預設建構函式被調用
得出結論(執行順序):
a 靜態成員變數和static塊首先被初始化,其執行順序和其在類中申明的順序有關
b
普通成員(執行個體變數)初始化
c
執行建構函式
2.繼承情況下Java初始化順序
用代碼和輸出直接說明:
package com.kael;/** * * @Title:Demo004 * @Description: * @Copyright:Copyright (c) 2012 * @Date:2012-7-25 * @author feilong.li */public class Initialization {// 主函數public static void main(String str[]) {TB tb = new TB();}}class Sample {Sample(String s) {System.out.println(s);}Sample() {System.out.println("Sample預設建構函式被調用");}}class TA {static {System.out.println("父類static 塊 1 執行");}static Sample staticSam1 = new Sample("父類 靜態成員staticSam1初始化");Sample sam1 = new Sample("父類 sam1成員初始化");static Sample staticSam2 = new Sample("父類 靜態成員staticSam2初始化");static {System.out.println("父類 static 塊 2 執行");}TA() {System.out.println("父類 Test預設建構函式被調用");}Sample sam2 = new Sample("父類 sam2成員初始化");}class TB extends TA {static Sample staticSamSub = new Sample("子類 靜態成員staticSamSub初始化");TB() {System.out.println("子類 TestSub 預設建構函式被調用");}Sample sam1 = new Sample("子類 sam1成員初始化");static Sample staticSamSub1 = new Sample("子類 靜態成員staticSamSub1初始化");static {System.out.println("子類 static 塊 執行");}Sample sam2 = new Sample("子類 sam2成員初始化");}
輸出結果:
父類static 塊 1 執行
父類 靜態成員staticSam1初始化
父類 靜態成員staticSam2初始化
父類 static 塊 2 執行
子類 靜態成員staticSamSub初始化
子類 靜態成員staticSamSub1初始化
子類 static 塊 執行
父類 sam1成員初始化
父類 sam2成員初始化
父類 Test預設建構函式被調用
子類 sam1成員初始化
子類 sam2成員初始化
子類 TestSub 預設建構函式被調用
得出結論(初始化順序):
a 父類靜態成員變數和static塊首先被初始化,其執行順序和其在類中申明的順序有關
b
子類靜態成員變數和static塊被初始化,其執行順序和其在類中申明的順序有關
c 父類普通成員(執行個體變數)初始化
d 父類構造方法被調用
e
子類普通成員(執行個體變數)初始化
f
子類建構函式被調用