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

公眾號