版權所有:(xiaodaoxiaodao)藍小刀 http://m.tkk7.com/xiaodaoxiaodao/archive/2007/06/06/122383.html ?

轉載請注明來源/作者

Java 對象初始化順序

?

java 對象是如何進行初始化的,新建一PrintClass.java文件如下(包括類PrintClass以及A和其子類B),編譯運行其中的main方法,

?

public class PrintClass {

??? public static void main(String[] args){

??????? new B();

??? }

??? PrintClass(String var) {

??????? System.out.println(var);

??? }

}

?

class A {

??? static PrintClass pClassA1 = new PrintClass("A. 靜態成員的初始化1");

??? static {

??????? System.out.println("A. 靜態初始化塊1");

??? }

??? static {

??????? System.out.println("A. 靜態初始化塊2");

??? }

??? static PrintClass pClassA2 = new PrintClass("A. 靜態成員的初始化2");

?

??? {

??????? System.out.println("A. 實例初始化塊1");

??? }

??? PrintClass pClassA = new PrintClass("A. 實例成員的初始化");

??? {

??????? System.out.println("A. 實例初始化塊2");

??? }

?

??? public int Avar;

??? public A() {

??????? System.out.println("A. 構造方法");

??????? doSomething();

??? }

?

??? private void doSomething() {

//??? public void doSomething() {

??????? Avar = 1111;

??????? System.out.println("Avar=" + Avar);

??? }

}

?

//class B extends A

class B extends A

{

??? public static void main(String[] args){

??????? new B();

??? }

??? public int Bvar = 2222;

?

??? {

??????? System.out.println("B. 實例初始化塊1");

??? }

??? {

??????? System.out.println("B. 實例初始化塊2");

??? }

??? PrintClass pClassB = new PrintClass("B. 實例成員的初始化");

?

??? static {

??????? System.out.println("B. 靜態初始化塊1");

??? }

??? static PrintClass pClassB1 = new PrintClass("B. 靜態成員的初始化1");

? ??static PrintClass pClassB2 = new PrintClass("B. 靜態成員的初始化2");

??? static {

??????? System.out.println("B. 靜態初始化塊2");

??? }

?

??? public B() {

??????? System.out.println("B. 構造方法");

??????? doSomething();

??? }

??? public void doSomething() {

??????? System.out.println("Bvar=" + Bvar);

??? }

}

?

可以看到運行結果為:

A. 靜態成員的初始化1

A. 靜態初始化塊1

A. 靜態初始化塊2

A. 靜態成員的初始化2

B. 靜態初始化塊1

B. 靜態成員的初始化1

B. 靜態成員的初始化2

B. 靜態初始化塊2

A. 實例初始化塊1

A. 實例成員的初始化

A. 實例初始化塊2

A. 構造方法

Avar=1111

B. 實例初始化塊1

B. 實例初始化塊2

B. 實例成員的初始化

B. 構造方法

Bvar=2222

?

由此可知當新建一java對象(上面main方法中new B())時,它的內部初始化順序為:

1.? 父類靜態成員和靜態初始化塊 ,按在代碼中出現的順序依次執行

2.? 子類靜態成員和靜態初始化塊 ,按在代碼中出現的順序依次執行

3.? 父類實例成員和實例初始化塊 ,按在代碼中出現的順序依次執行

4.? 父類構造方法

5.? 子類實例成員和實例初始化塊 ,按在代碼中出現的順序依次執行

6.? 子類構造方法

?