關(guān)于Java中代碼塊的執(zhí)行順序
前言
先說總結(jié):
父類靜態(tài)字段 —> 父類靜態(tài)代碼塊 —> 子類靜態(tài)字段 —> 子類靜態(tài)代碼塊 —> 父類成員變量和非靜態(tài)塊(順序加載) —> 父類構(gòu)造函數(shù) —> 子類成員變量和非靜態(tài)塊(順序加載) —> 子類構(gòu)造函數(shù)

- 靜態(tài)代碼塊:用staitc聲明,jvm加載類時(shí)執(zhí)行,僅執(zhí)行一次。
- 構(gòu)造代碼塊:類中直接用{}定義,每一次創(chuàng)建對象時(shí)執(zhí)行。
- 執(zhí)行順序優(yōu)先級:靜態(tài)塊,main(),構(gòu)造塊,構(gòu)造方法。
構(gòu)造函數(shù)
public HelloA(){//構(gòu)造函數(shù)
}關(guān)于構(gòu)造函數(shù),以下幾點(diǎn)要注意:
- 對象一建立,就會(huì)調(diào)用與之相應(yīng)的構(gòu)造函數(shù),也就是說,不建立對象,構(gòu)造函數(shù)時(shí)不會(huì)運(yùn)行的。
- 構(gòu)造函數(shù)的作用是用于給對象進(jìn)行初始化。
- 一個(gè)對象建立,構(gòu)造函數(shù)只運(yùn)行一次,而一般方法可以被該對象調(diào)用多次。
構(gòu)造代碼塊
{//構(gòu)造代碼塊
}關(guān)于構(gòu)造代碼塊,以下幾點(diǎn)要注意:
- 構(gòu)造代碼塊的作用是給對象進(jìn)行初始化。
- 對象一建立就運(yùn)行構(gòu)造代碼塊了,而且優(yōu)先于構(gòu)造函數(shù)執(zhí)行。這里要強(qiáng)調(diào)一下,有對象建立,才會(huì)運(yùn)行構(gòu)造代碼塊,類不能調(diào)用構(gòu)造代碼塊的,而且構(gòu)造代碼塊與構(gòu)造函數(shù)的執(zhí)行順序是前者先于后者執(zhí)行。
- 構(gòu)造代碼塊與構(gòu)造函數(shù)的區(qū)別是:構(gòu)造代碼塊是給所有對象進(jìn)行統(tǒng)一初始化,而構(gòu)造函數(shù)是給對應(yīng)的對象初始化,因?yàn)闃?gòu)造函數(shù)是可以多個(gè)的,運(yùn)行哪個(gè)構(gòu)造函數(shù)就會(huì)建立什么樣的對象,但無論建立哪個(gè)對象,都會(huì)先執(zhí)行相同的構(gòu)造代碼塊。也就是說,構(gòu)造代碼塊中定義的是不同對象共性的初始化內(nèi)容。
靜態(tài)代碼塊
static {//靜態(tài)代碼塊
}關(guān)于靜態(tài)代碼塊,要注意的是:
- 它是隨著類的加載而執(zhí)行,只執(zhí)行一次,并優(yōu)先于主函數(shù)。具體說,靜態(tài)代碼塊是由類調(diào)用的。類調(diào)用時(shí),先執(zhí)行靜態(tài)代碼塊,然后才執(zhí)行主函數(shù)的。
- 靜態(tài)代碼塊其實(shí)就是給類初始化的,而構(gòu)造代碼塊是給對象初始化的。
- 靜態(tài)代碼塊中的變量是局部變量,與普通函數(shù)中的局部變量性質(zhì)沒有區(qū)別。
- 一個(gè)類中可以有多個(gè)靜態(tài)代碼塊。
public class Test {
staitc int cnt=6;
static {
cnt += 9;
}
public static void main(String[] args) {
System.out.println(cnt);
}
static {
cnt /= 3;
}
}
// 5Java類初始化順序
對于一個(gè)類的情況
public class HelloA {
public HelloA(){//構(gòu)造函數(shù)
System.out.println("A的構(gòu)造函數(shù)");
}
{//構(gòu)造代碼塊
System.out.println("A的構(gòu)造代碼塊");
}
static {//靜態(tài)代碼塊
System.out.println("A的靜態(tài)代碼塊");
}
public static void main(String[] args) {
}
}
// A的靜態(tài)代碼塊public class HelloA {
public HelloA(){//構(gòu)造函數(shù)
System.out.println("A的構(gòu)造函數(shù)");
}
{//構(gòu)造代碼塊
System.out.println("A的構(gòu)造代碼塊");
}
static {//靜態(tài)代碼塊
System.out.println("A的靜態(tài)代碼塊");
}
public static void main(String[] args) {
HelloA a=new HelloA();
}
}
// A的靜態(tài)代碼塊
// A的構(gòu)造代碼塊
// A的構(gòu)造函數(shù)public class HelloA {
public HelloA(){//構(gòu)造函數(shù)
System.out.println("A的構(gòu)造函數(shù)");
}
{//構(gòu)造代碼塊
System.out.println("A的構(gòu)造代碼塊");
}
static {//靜態(tài)代碼塊
System.out.println("A的靜態(tài)代碼塊");
}
public static void main(String[] args) {
HelloA a=new HelloA();
HelloA b=new HelloA();
}
}
// A的靜態(tài)代碼塊
// A的構(gòu)造代碼塊
// A的構(gòu)造函數(shù)
// A的構(gòu)造代碼塊
// A的構(gòu)造函數(shù)對于一個(gè)類而言,按照如下順序執(zhí)行:
- 執(zhí)行靜態(tài)代碼塊
- 執(zhí)行構(gòu)造代碼塊
- 執(zhí)行構(gòu)造函數(shù)
對于靜態(tài)變量、靜態(tài)初始化塊、變量、初始化塊、構(gòu)造器,它們的初始化順序依次是靜態(tài)變量、靜態(tài)初始化塊)>(變量、初始化塊)>構(gòu)造器。
public class InitialOrderTest {
/* 靜態(tài)變量 */
public static String staticField = "靜態(tài)變量";
/* 變量 */
public String field = "變量";
/* 靜態(tài)初始化塊 */
static {
System.out.println( staticField );
System.out.println( "靜態(tài)初始化塊" );
}
/* 初始化塊 */
{
System.out.println( field );
System.out.println( "初始化塊" );
}
/* 構(gòu)造器 */
public InitialOrderTest(){
System.out.println( "構(gòu)造器" );
}
public static void main( String[] args ){
new InitialOrderTest();
}
}
// 靜態(tài)變量
// 靜態(tài)初始化塊
// 變量
// 初始化塊
// 構(gòu)造器對于繼承情況
public class HelloA {
public HelloA(){//構(gòu)造函數(shù)
System.out.println("A的構(gòu)造函數(shù)");
}
{//構(gòu)造代碼塊
System.out.println("A的構(gòu)造代碼塊");
}
static {//靜態(tài)代碼塊
System.out.println("A的靜態(tài)代碼塊");
}
}
public class HelloB extends HelloA{
public HelloB(){//構(gòu)造函數(shù)
System.out.println("B的構(gòu)造函數(shù)");
}
{//構(gòu)造代碼塊
System.out.println("B的構(gòu)造代碼塊");
}
static {//靜態(tài)代碼塊
System.out.println("B的靜態(tài)代碼塊");
}
public static void main(String[] args) {
HelloB b=new HelloB();
}
}
// A的靜態(tài)代碼塊
// B的靜態(tài)代碼塊
// A的構(gòu)造代碼塊
// A的構(gòu)造函數(shù)
// B的構(gòu)造代碼塊
// B的構(gòu)造函數(shù)當(dāng)涉及到繼承時(shí),按照如下順序執(zhí)行:
- 執(zhí)行父類的靜態(tài)代碼塊,并初始化父類靜態(tài)成員變量
- 執(zhí)行子類的靜態(tài)代碼塊,并初始化子類靜態(tài)成員變量
- 執(zhí)行父類的構(gòu)造代碼塊,執(zhí)行父類的構(gòu)造函數(shù),并初始化父類普通成員變量
- 執(zhí)行子類的構(gòu)造代碼塊, 執(zhí)行子類的構(gòu)造函數(shù),并初始化子類普通成員變量
class Parent {
/* 靜態(tài)變量 */
public static String p_StaticField = "父類--靜態(tài)變量";
/* 變量 */
public String p_Field = "父類--變量";
protected int i = 9;
protected int j = 0;
/* 靜態(tài)初始化塊 */
static {
System.out.println( p_StaticField );
System.out.println( "父類--靜態(tài)初始化塊" );
}
/* 初始化塊 */
{
System.out.println( p_Field );
System.out.println( "父類--初始化塊" );
}
/* 構(gòu)造器 */
public Parent(){
System.out.println( "父類--構(gòu)造器" );
System.out.println( "i=" + i + ", j=" + j );
j = 20;
}
}
public class SubClass extends Parent {
/* 靜態(tài)變量 */
public static String s_StaticField = "子類--靜態(tài)變量";
/* 變量 */
public String s_Field = "子類--變量";
/* 靜態(tài)初始化塊 */
static {
System.out.println( s_StaticField );
System.out.println( "子類--靜態(tài)初始化塊" );
}
/* 初始化塊 */
{
System.out.println( s_Field );
System.out.println( "子類--初始化塊" );
}
/* 構(gòu)造器 */
public SubClass(){
System.out.println( "子類--構(gòu)造器" );
System.out.println( "i=" + i + ",j=" + j );
}
/* 程序入口 */
public static void main( String[] args ){
System.out.println( "子類main方法" );
new SubClass();
}
}
// 父類--靜態(tài)變量
// 父類--靜態(tài)初始化塊
// 子類--靜態(tài)變量
// 子類--靜態(tài)初始化塊
// 子類main方法
// 父類--變量
// 父類--初始化塊
// 父類--構(gòu)造器
// i=9, j=0
// 子類--變量
// 子類--初始化塊
// 子類--構(gòu)造器
// i=9,j=20子類的靜態(tài)變量和靜態(tài)初始化塊的初始化是在父類的變量、初始化塊和構(gòu)造器初始化之前就完成了。
靜態(tài)變量、靜態(tài)初始化塊,變量、初始化塊初始化了順序取決于它們在類中出現(xiàn)的先后順序。
到此這篇關(guān)于關(guān)于Java中代碼塊的執(zhí)行順序的文章就介紹到這了,更多相關(guān)Java代碼塊執(zhí)行內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java分支循環(huán)與數(shù)組核心知識(shí)點(diǎn)總結(jié)
這篇文章主要介紹了Java分支循環(huán)與數(shù)組核心知識(shí)點(diǎn)總結(jié)的相關(guān)資料,理解循環(huán)與分支結(jié)構(gòu)是掌握編程的基礎(chǔ),重復(fù)執(zhí)行操作的循環(huán)和基于條件的執(zhí)行路徑分支有助于構(gòu)建復(fù)雜的程序邏輯,需要的朋友可以參考下2026-01-01
IDEA使用JDK21控制臺(tái)中文問號(hào)的解決過程
IDEA切換至JDK21后,控制臺(tái)中文顯示異常,嘗試UTF-8編碼設(shè)置無效,最終通過配置Maven VMOptions為GBK解決2025-09-09
Java數(shù)據(jù)結(jié)構(gòu)與算法之棧(Stack)實(shí)現(xiàn)詳解
這篇文章主要為大家詳細(xì)介紹了Java數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)筆記第二篇,Java數(shù)據(jù)結(jié)構(gòu)與算法之棧Stack實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09

