1. 程式人生 > >大括號{}的意義與靜態程式碼塊與建構函式的載入關係

大括號{}的意義與靜態程式碼塊與建構函式的載入關係

import java.util.HashMap;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;
import java.util.TreeSet;


import javax.annotation.PostConstruct;


class T {
static {
System.out.println("1");
}


{
System.out.println("2");
}


T() {
System.out.println("父類構造");

}
public static void got(){
System.out.println("呼叫T類的方法,靜態方法");
}
static {
System.out.println("3");
}
{
System.out.println("4");
}
}


public class Test extends T {

public Test() {
System.out.println("子類建構函式");
}
static {
System.out.println("5");
}
{
System.out.println("6");
}


public static void main(String[] args) {

/*Test t = new Test();

t.get();

System.out.println("=====================");
Test.got();
System.out.println("=====================");*/
Test.post();
}

public void get(){
System.out.println("呼叫Test類的方法");
}

public static void post(){
System.out.println("呼叫Test類的靜態方法");
}
static {
System.out.println("7");
}
{
System.out.println("8");

}
}

new Test()時,輸出    1      3                     5    7                         2     4                   父類的構造    6   8                  子類的構造

                              (父類靜態程式碼塊)  (子類靜態程式碼塊)    (父類初始程式碼塊)                  (子類初始程式碼塊)

呼叫Test類的內部get方法輸出 1 3 5 7 2 4 父類的構造 6 8 子類的構造 呼叫Test類的方法

Test.got()時輸出 1 3 5 7 呼叫T類的方法,靜態方法
Test.post()時輸出 1 3 5 7 呼叫Test類的靜態方法

其實在類內部{}只是代表在呼叫建構函式之前在{}中初始化,static{}只在類載入時呼叫

new子類的物件時,先呼叫父類static{}裡的東西,再呼叫子類裡的static{},再呼叫父類{}({}為初始化程式碼塊,在靜態塊後、構造方法前執行),再呼叫父類構造方法,再呼叫子類構造方法

呼叫子類或者父類的靜態方法時,先呼叫父類的static{}再呼叫子類的static{}