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. 子類構造方法