首頁 >Java >Java基礎 >靜態程式碼區塊、建構程式碼區塊、建構方法的執行順序是什麼

靜態程式碼區塊、建構程式碼區塊、建構方法的執行順序是什麼

青灯夜游
青灯夜游原創
2022-01-25 11:41:1715079瀏覽

執行順序是:先執行“靜態程式碼區塊”,再執行“建構程式碼區塊”,最後執行“建構程式碼區塊”。靜態程式碼區塊是類別層級的,而建構程式碼區塊和建構方法是實例層級的,因而靜態程式碼區塊先執行;又因建構程式碼區塊是獨立的,必須依附載體才能運行,因而建構程式碼區塊需放到構造方法前。

靜態程式碼區塊、建構程式碼區塊、建構方法的執行順序是什麼

本教學操作環境:windows7系統、java8版、DELL G3電腦。

建構程式碼區塊、靜態程式碼區塊與建構方法是類別中三種不同的程式碼區塊,那麼他們到底有什麼差別呢?

一、三種程式碼區塊簡介

靜態程式碼區塊:用staitc聲明,jvm載入類別時執行,僅執行一次

建構程式碼區塊:類別中直接用{}定義,每一次建立物件時執行。

執行順序優先權:靜態區塊,main(),建構區塊,建構方法。

class A
{
    //构造代码块
    {
        System.out.println("构造代码块A");
    }
    //静态代码块
    static
    {
        System.out.println("静态代码块A");
    }
    //构造方法
    public A()
    {
        System.out.println("构造方法A");
    }
}

二、三者的執行順序

為了弄清楚三者的執行順序,我們對類別 A 進行實例化,分別進行單一實例和多個實例的測試。

2.1 單一實例

class Demo
{
    public static void main(String[] args)
    {
        new A();
    }
}

2.2 多個實例

class Demo
{
    public static void main(String[] args)
    {
        new A();
        new A();
        new A();
    }
}

#三、繼承體系中的順序

class B extends A
{
    //构造代码块
    {
        System.out.println("构造代码块B");
    }
    //静态代码块
    static
    {
        System.out.println("静态代码块B");
    }
    //构造方法
    public B()
    {
        System.out.println("构造方法B");
    }
}

class Demo
{
    public static void main(String[] args)
    {
        new B();
    }
}

四、總結

#    1、在創建物件的過程中,三者的執行順序是:靜態程式碼區塊  -->  建構程式碼區塊  -->  建構方法;

1.靜態程式碼區塊:是在類別的載入過程的第三步驟初始化的時候進行的,主要目的是給類別變數賦予初始值。
2.建構程式碼區塊:是獨立的,必須依附載體才能運行,Java會把構造程式碼區塊放到每個建構方法的前面,用於實例化一些共有的實例變量,減少程式碼量。
3.建構方法:用於實例化變數。

1是類別層級的,2、3是實例層級的,自然1要優先23。

在就明白一點:對子類得主動使用會導致對其父類得主動使用,所以儘管實例化的是子類,但也會導致父類的初始化和實例化,且優於子類別執行。

    2、每創建一個對象,建構程式碼區塊和建構方法就會執行一次;而不管創建多少個對象,靜態程式碼區塊僅在創建第一個物件時執行一次;
    3、建立子類別物件時,子類別的靜態程式碼區塊在父類別的靜態程式碼區塊後面執行,但優先於父類別的建構程式碼區塊和建構方法;
    4、建立子類別物件時,子類別的建構程式碼區塊在父類別的建構方法後執行。

相關影片教學推薦:Java影片教學

#

以上是靜態程式碼區塊、建構程式碼區塊、建構方法的執行順序是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn