1. 程式人生 > >靜態程式碼塊、構造程式碼塊與區域性程式碼塊的順序探討

靜態程式碼塊、構造程式碼塊與區域性程式碼塊的順序探討

JavaSE學習過程中,筆者一直在這一塊糾結,總是理解的一知半解,靜態程式碼塊和構造程式碼塊的執行順序到底是什麼樣的,花了很久的時間,現在把我到目前為止理解的情況記錄下來

  1. 區域性程式碼塊
    區域性程式碼塊就是定義用{}劃定的區域,其作用的區域在方法中,只是起到了劃分作用域的作用。
  2. 構造程式碼塊
    構造程式碼塊定義在類中成員位置上,優先於構造方法執行,每建立一個物件均會執行一次構造程式碼塊。

這裡筆者通過驗證,發現:構造程式碼塊雖然會優先於構造方法執行,但是它是在本類構造方法中預設的父類構造方法執行完後才會執行

class Fu {
     {
        System.out.println("1");
    }
    public  Fu(){
        System.out.println("a");
    }
}
class Zi extends Fu {
    {
        System.out.println("2");
    }
    public  Zi(){
        System.out.println("b");
    }
}
class Demo {
    public static void main(String[] args) 	{
        Fu f = new Zi();
    }
}

上述程式碼執行的結果是:1a2b,即等父類構造程式碼塊與構造方法執行完,再執行之類的構造程式碼塊與構造方法。
筆者之前一直覺得結果應該是:21ab(因為認為super()這個預設的呼叫父類構造方法在本類構造方法中,應該在本類的構造程式碼塊後面執行)
是因為筆者沒有深刻理解構造程式碼塊會優先與構造方法執行的真正含義,因為Java是有分層初始化機制的,子類必須在父類初始化完以後才能初始化(構造方法執行)
4. 靜態程式碼塊
靜態程式碼塊也是定義在成員位置上,使用static修飾。
因為靜態程式碼塊有static修飾,因此,可以知道這個程式碼塊是在類載入的過程中就執行的,也就是說靜態程式碼塊的執行優先於物件的建立。

`
public class Test {
 
	public static void main(String[] args) {
		Son son = new Son();
	}
 
}
class Father{
	static {
		System.out.println("父靜態程式碼塊");            //1
	}	
	{
		System.out.println("父構造程式碼塊");            //3
	}
	Father(){
		System.out.println("父構造方法");              //4
	}
}
class Son extends Father{
	static {
		System.out.println("子靜態程式碼塊");            //2
	}	
	{
		System.out.println("子構造程式碼塊");            //5
	}
	Son(){
		System.out.println("子構造方法");              //6
	}
}`

首先,JVM呼叫了main方法,main方法進棧,此時遇到Son son = new Son()這句語句,會將Father.class和Son.class分別載入進記憶體,之後才會建立物件。我們知道,靜態程式碼塊的執行優先於物件的建立,也就是說當Father.class載入進記憶體時,父類的靜態程式碼塊會隨著Father.class一起載入,然後是Son.class載入進記憶體,而與此同時子類的靜態程式碼塊也會隨著Son.class一起載入進記憶體。
接著將會執行子類的構造方法,而由於分層初始化的機制,需要先初始化父類,再初始化子類,於是這段程式碼的結果就是:
父類靜態程式碼塊
子類靜態程式碼塊
父類構造程式碼塊
父類構造方法
子類構造程式碼塊
子類構造方法

相關推薦

Java類成員變數普通成員變數初始化構造方法的初始化和執行順序

 序言   關於類的static成員變數初始化、static初始化塊、例項的普通成員變數初始化、例項的普通初始化塊以及建構函式的執行順序,我一直不是十分明確地知道,今天專門花了幾個小時的時間參考網上資料設計出了比較明瞭的測試程式碼,有程式碼有結果有真相。總體而言,sta

靜態程式碼構造程式碼區域性程式碼順序探討

JavaSE學習過程中,筆者一直在這一塊糾結,總是理解的一知半解,靜態程式碼塊和構造程式碼塊的執行順序到底是什麼樣的,花了很久的時間,現在把我到目前為止理解的情況記錄下來 區域性程式碼塊 區域性程式碼塊就是定義用{}劃定的區域,其作用的區域在方法中,只是起到了

Java中靜態程式碼構造方法程式碼父類子類之間執行順序

【1】幾個概念 靜態程式碼塊 在java中使用static關鍵字宣告的程式碼塊。每個靜態程式碼塊只會執行一次。JVM在載入類時會執行靜態程式碼塊,靜態程式碼塊先於主方法執行。 注意: 靜態程式碼塊不能存在於任何方法體內; 靜態程式碼塊不能直接訪問靜態例項變數和例

父類子類的靜態程式碼程式碼構造方法執行順序

StaticTest.java package com.staticTest; /** * 測試靜態程式碼塊執行順序 * 1、static能修飾的類只有靜態內部類 * 2、靜態方法不能直接訪問非

java之普通程式碼構造靜態

程式碼塊 定義:{}中定義的一段程式碼 根據程式碼塊出現的位置以及關鍵字不同,分為下面四類程式碼塊 普通程式碼塊 定義在方法中的程式碼塊,解決方法中變數重新命名的問題,瞭解即可,沒什麼意義。 public class 程式碼塊 { public static void ma

淺析普通程式碼構造程式碼靜態程式碼

            初次學習程式碼塊、構造程式碼塊、靜態程式碼塊後,決定寫此文章特別總結一下學習成果,本文用最淺顯的語言講述程式碼塊,若有錯誤請大神們指出,十分感謝(鞠躬)        

Java中的程式碼靜態程式碼構造程式碼同步程式碼

Java中{}內的東西統稱為程式碼塊分為靜態程式碼塊、構造程式碼塊、區域性程式碼塊、同步程式碼塊 所有{}內定義的變數,其作用域僅限於該{},離開{}後其內部的變數棧空間和堆空間都被JVM(Java Virtual Machine)所回收而不能再使用。在{}中不能定以兩個同名變數,不能定義兩

【面相物件】靜態程式碼構造程式碼和建構函式的執行順序

前言:java有四大程式碼塊:靜態程式碼塊、構造程式碼塊、區域性程式碼塊、同步程式碼塊。 ……………………………………………………………………………………………… ……………………………………………………………………………………………… ………………………………………………

Java基礎——靜態程式碼構造程式碼建構函式以及Java類初始化順序

閱讀目錄 建構函式 構造程式碼塊 靜態程式碼塊 Java類初始化順序 靜態程式碼塊:用staitc宣告,jvm載入類時執行,僅執行一次 構造程式碼塊:類中直接用{}定義,每一次建立物件時執行。 執行順序優先順序:靜態塊,main(),構造塊,構造方法。

靜態程式碼構造靜態方法在類中呼叫的先後順序關係

package test; /* * 當一個類中,有靜態方法、靜態程式碼塊、構造方法時; * 如果 初始化該類,new一個物件,則會 * 1,先呼叫靜態程式碼塊; * 2. 再呼叫構造器,初始化該物件; * 3.靜態方法需要被主動顯式呼叫; * 可通過以下簡單

JAVA學習——靜態程式碼構造程式碼構造普通程式碼的執行順序

概念 在此之前,我們先來看看JAVA中的這些程式碼塊: 靜態程式碼塊 在類中使用static修飾,並使用"{}"括起來的程式碼片段。用於靜態變數的初始化或物件建立前的環境初始化。 構造程式碼塊 在類中沒與任何的字首或字尾,並使用"{}"括起來的程式碼片段。

Java中的普通程式碼構造靜態程式碼

程式碼塊   程式碼塊定義:使用“{}”定義的一段程式碼。   根據程式碼塊定義的位置以及關鍵字,又可分為以下四種: 普通程式碼塊 構造塊 靜態塊 同步程式碼塊 1.1 普通程式碼塊   普通程式碼塊:定義在方法中的程式碼塊。   範例:觀察普通程式碼塊

java-程式碼-區域性程式碼構造程式碼靜態程式碼

1、程式碼塊概述: 在Java中,使用{ }括起來的程式碼被稱為程式碼塊。   2、程式碼塊分類: 根據其位置和宣告的不同,可以分為區域性程式碼塊,構造程式碼塊、靜態程式碼塊和同步程式碼塊(多執行緒)。   3、常見程式碼塊的應用:  -  區域性程式碼塊:在方法中

java中靜態程式碼構造程式碼構造方法main函式的執行順序

靜態程式碼塊:在類被載入的時候就運行了,且只執行一次。static{} 構造程式碼塊:在建立物件時被呼叫,每次建立物件都會呼叫一次。比靜態程式碼塊少了static。{} 構造方法:用於建立物件時定義初始化的狀態。建構函式不能直接呼叫,必須通過new運算子在建立物件時才會自動呼叫,一般方法是在程式

靜態程式碼構造程式碼和建構函式的執行順序

靜態程式碼塊 static {   執行語句 } 在java中使用static關鍵字宣告的程式碼塊。靜態塊用於初始化類,為類的屬性初始化。 每個靜態程式碼塊只會執行一次。由於JVM在載入類時會執行靜態程式碼塊,所以靜態程式碼塊先於主方法執行。 如果類中包含多個靜態程式碼塊,那麼將按

Java提高篇——靜態程式碼構造程式碼建構函式以及Java類初始化順序

靜態程式碼塊:用staitc宣告,jvm載入類時執行,僅執行一次構造程式碼塊:類中直接用{}定義,每一次建立物件時執行。執行順序優先順序:靜態塊,main(),構造塊,構造方法。 建構函式 public HelloA(){//建構函式 } 關於建構函式,以下幾點

【小家java】類中靜態程式碼構造程式碼靜態變數執行順序和繼承邏輯

相關閱讀 每篇一句 上帝給每個人都安排了幸福的一生,我們的任務就是把它走完 1、概述 誠如各位所知,java的三大特性:封裝、繼承、多型。其中繼承,是java中最有學問的一點也是最相對來說最難理解的一些東西,本文針對於此,做一些例項分析,希望能夠幫助大家

靜態程式碼構造

靜態程式碼塊:用static宣告,在虛擬機器載入類時執行,只執行一次 構造程式碼塊:使用{}包括,在建立物件時使用 優先順序順序:靜態程式碼塊>main()方法>構造程式碼塊>建構函式 關於構造程式碼塊,以下幾點要注意: 構造程式碼塊

靜態程式碼程式碼構造main方法的執行順序

java物件的初始化順序 (1)類載入之後,按從上到下(從父類到子類)執行被static修飾的語句; (2)當static語句執行完之後,再執行main方法; (3)如果有語句new了自身的物件,將從上到下執行構造程式碼塊、構造器(兩者可以說繫結在一起)。 看程式碼:

父類靜態構造程式碼構造程式碼建構函式

如果類還沒有被載入:1、先執行父類的靜態程式碼塊和靜態變數初始化,並且靜態程式碼塊和靜態變數的執行順序只跟程式碼中出現的順序有關。2、執行子類的靜態程式碼塊和靜態變數初始化。3、執行父類的例項變數初始化4、執行父類的建構函式5、執行子類的例項變數初始化6、執行子類的建構函式