Java程序的初始化順序,static{}靜態(tài)代碼塊和實例語句塊的使用方式
1、Java程序的初始化順序
在 Java 語言中,當(dāng)實例對象時,對象所在類的所有成員變量首先要進行初始化,只有當(dāng)所有類成員完成初始化后,才會調(diào)用對象所在的構(gòu)造函數(shù)創(chuàng)建對象。
Java 程序的初始化一般遵循以下三個原則:
- 靜態(tài)對象(變量)、非靜態(tài)對象(變量)。
- 父類優(yōu)先于子類進行初始化。
- 按照成員變量定義順序進行初始化。
Java 程序的初始化工作可以在許多不同的代碼塊中來完成,
例如:靜態(tài)代碼塊、實例語句塊、構(gòu)造函數(shù)等。
1.1 普通類的執(zhí)行順序
普通類的執(zhí)行順序為:靜態(tài)代碼塊 → 實例語句塊 → 構(gòu)造函數(shù)。
【示例】普通類的執(zhí)行順序。
(1)創(chuàng)建普通類
/**
* 普通類
* @author pan_junbiao
**/
public class MyClass
{
//靜態(tài)代碼塊
static
{
System.out.println("靜態(tài)代碼塊");
}
//實例語句塊
{
System.out.println("實例語句塊");
}
//構(gòu)造函數(shù)
public MyClass()
{
System.out.println("構(gòu)造函數(shù)");
}
}(2)執(zhí)行方法
/**
* Java普通類的執(zhí)行順序
* @author pan_junbiao
*/
public static void main(String[] args)
{
//創(chuàng)建普通類對象
MyClass myClass = new MyClass();
}執(zhí)行結(jié)果:

1.2 繼承類的執(zhí)行順序
繼承類的執(zhí)行順序為:父類靜態(tài)代碼塊 → 子類靜態(tài)代碼塊 → 父類實例語句塊 → 父類構(gòu)造函數(shù) → 子類實例語句塊 → 子類構(gòu)造函數(shù)。
【示例】繼承類的執(zhí)行順序。
(1)創(chuàng)建父類
/**
* 父類
* @author pan_junbiao
**/
public class Parent
{
//靜態(tài)代碼塊
static
{
System.out.println("父類靜態(tài)代碼塊");
}
//實例語句塊
{
System.out.println("父類實例語句塊");
}
//構(gòu)造函數(shù)
public Parent()
{
System.out.println("父類構(gòu)造函數(shù)");
}
}(2)創(chuàng)建子類
/**
* 子類
* @author pan_junbiao
**/
public class Child extends Parent
{
//靜態(tài)代碼塊
static
{
System.out.println("子類靜態(tài)代碼塊");
}
//實例語句塊
{
System.out.println("子類實例語句塊");
}
//構(gòu)造函數(shù)
public Child()
{
System.out.println("子類構(gòu)造函數(shù)");
}
}(3)執(zhí)行方法
/**
* Java繼承類的執(zhí)行順序
* @author pan_junbiao
*/
public static void main(String[] args)
{
//創(chuàng)建子類對象
Child child = new Child();
}執(zhí)行結(jié)果:

1.3 成員變量初始化的優(yōu)先級
這里需要注意的是,(靜態(tài))非靜態(tài)成員域在定義時初始化和(靜態(tài))非靜態(tài)塊中初始化的優(yōu)先級是平級的,也就是說按照從上到下初始化,最后一次初始化為最終的值(不包括非靜態(tài)的成員域在構(gòu)造器中初始化)。
所以在(靜態(tài))非靜態(tài)塊中初始化的域甚至能在該域聲明的上方,因為分配存儲空間在初始化之前就完成了。
【示例】(靜態(tài))非靜態(tài)塊中成員變量初始化的優(yōu)先級。
/**
* (靜態(tài))非靜態(tài)塊中成員變量初始化的優(yōu)先級
* @author pan_junbiao
**/
public class TestStatic
{
static { a = 2;}
static int a = 1;
static int b = 3;
static { b = 4; }
public static void main(String[] args)
{
System.out.println("初始化后的變量的值:");
System.out.println(a);
System.out.println(b);
}
}執(zhí)行結(jié)果:

2、static{}靜態(tài)代碼塊的使用
static{} 靜態(tài)代碼塊在類的加載時執(zhí)行,并且只執(zhí)行一次,且在 main 方法之前執(zhí)行。一個類中可以有多個靜態(tài)代碼塊,執(zhí)行順序自上而下。一個靜態(tài)代碼塊只能訪問該靜態(tài)代碼塊之前的靜態(tài)變量。
static{} 靜態(tài)代碼塊在類初次被加載的時候執(zhí)行且僅會被執(zhí)行一次,所以可以起到優(yōu)化程序性能的作用。
static{} 靜態(tài)代碼塊的語法:
//靜態(tài)代碼塊
static
{
//Java程序
}3、實例語句塊的使用
除了static{} 靜態(tài)代碼塊之外,還有一種語句塊叫做:實例語句塊。
顧名思義,就是在實例化對象時執(zhí)行,并不是在類加載時執(zhí)行。
實例語句塊的具體執(zhí)行時間是在實例化對象時的構(gòu)造函數(shù)之前執(zhí)行的。
實例語句塊的語法:
//實例語句塊
{
//Java程序
}4、練習(xí)題目
最后來一道題目練習(xí)一下關(guān)于 static{} 靜態(tài)代碼塊、實例語句塊和構(gòu)造函數(shù)的執(zhí)行順序。
例題如下:
/**
* 判斷以下程序的執(zhí)行順序
* @author pan_junbiao
**/
public class CodeOrder
{
//靜態(tài)代碼塊
static
{
System.out.println("A");
}
//程序入口
public static void main(String[] args)
{
System.out.println("Y");
new CodeOrder();
System.out.println("Z");
}
//構(gòu)造函數(shù)
public CodeOrder()
{
System.out.println("B");
}
//實例語句塊
{
System.out.println("C");
}
//靜態(tài)代碼塊
static
{
System.out.println("X");
}
}執(zhí)行結(jié)果:

總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java中子類調(diào)用父類構(gòu)造方法的問題分析
本篇文章介紹了,Java中子類調(diào)用父類構(gòu)造方法的問題分析。需要的朋友參考下2013-04-04
mybatisplus 多表關(guān)聯(lián)條件分頁查詢的實現(xiàn)
本文主要介紹了mybatisplus 多表關(guān)聯(lián)條件分頁查詢的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01
探索Java中private方法添加@Transactional事務(wù)未生效原因
你又遇到過明明給private方法添加了@Transactional但是事務(wù)依然沒有生效的情況嗎,具體原因本篇文章將詳細(xì)告訴你,有需要的朋友跟著小編往下看吧2021-11-11
Spring?Cloud?Ribbon?負(fù)載均衡使用策略示例詳解
Spring?Cloud?Ribbon?是基于Netflix?Ribbon?實現(xiàn)的一套客戶端負(fù)載均衡工具,Ribbon客戶端組件提供了一系列的完善的配置,如超時,重試等,這篇文章主要介紹了Spring?Cloud?Ribbon?負(fù)載均衡使用策略示例詳解,需要的朋友可以參考下2023-03-03
SpringBoot中@AutoConfiguration和@Configuration區(qū)別
@AutoConfiguration是Spring Boot2.4引入的一個新注解,用于標(biāo)記自動配置類,它是對傳統(tǒng)@Configuration 注解的增強,下面就來詳細(xì)的介紹一下這兩者的區(qū)別,感興趣的可以了解一下2025-09-09

