一文整懂 Java 中靜態代碼塊 / 初始塊 / 構造方法的執行順序
“ 相信,刷過面試題應該都碰到過很多題,關於類繼承後 Java 中靜態代碼塊 / 初始塊 / 構造方法的執行順序問題,每每記一下又忘了,那麼,今天來用不多的時間複習一下”
01.靜態代碼塊 / 初始塊 / 構造方法的執行順序
package erdan.demo;
public class Demo {
static {
System.out.println("靜態代碼塊 111");
}
static {
System.out.println("靜態代碼塊 222");
}
{
System.out.println("初始塊 111");
}
{
System.out.println("初始塊 222");
}
public Demo() {
System.out.println("無參構造方法");
}
public Demo(int i) {
System.out.println("有參構造方法" + i);
}
public static void main(String[] args) {
new Demo();
}
}
輸出:
靜態代碼塊 111
靜態代碼塊 222
初始塊 111
初始塊 222
無參構造方法
上圖:
筆記:初始塊(非靜態代碼塊)總是和構造方法是一家子,會一塊出現
02.測試繼承之後的執行順序
package erdan.demo;
public class ChildrenDemo extends Demo{
static {
System.out.println("ChildrenDemo:靜態代碼塊 111");
}
static {
System.out.println("ChildrenDemo:靜態代碼塊 222");
}
{
System.out.println("ChildrenDemo 初始塊 111");
}
{
System.out.println("ChildrenDemo 初始塊 222");
}
public ChildrenDemo() {
System.out.println("無參構造方法 ChildrenDemo");
}
public ChildrenDemo(int i) {
System.out.println("有參構造方法 ChildrenDemo:" + i);
}
public static void main(String[] args) {
new ChildrenDemo();
System.out.println("---------------------------------");
new ChildrenDemo(1);
}
}
輸出:
靜態代碼塊 111
靜態代碼塊 222
ChildrenDemo:靜態代碼塊 111
ChildrenDemo:靜態代碼塊 222
初始塊 111
初始塊 222
無參構造方法
ChildrenDemo 初始塊 111
ChildrenDemo 初始塊 222
無參構造方法 ChildrenDemo
---------------------------------
初始塊 111
初始塊 222
無參構造方法
ChildrenDemo 初始塊 111
ChildrenDemo 初始塊 222
有參構造方法 ChildrenDemo:1
可以看到下面除了調用有參無參的差別外,虛線下比上面少了靜態代碼塊
ps:
- 類比子類先執行
- 態代碼塊只會輸出一次,初始塊與構造方法是一家子,輸出在一塊,初始塊會在構造前初始化
03.總結
- 父類比子類先行執行
- 靜態代碼塊,在類第一次加載的時候,會初始化一次,適合項目中初始化全局參數,常量等
- 初始塊與構造方法是一家子,但是初始塊會在構造函數前執行,初始塊適合重載構造函數存在相同代碼,可以抽出來使用