您現在的位置是:首頁 > 運動

java內部類及類載入順序

由 APP架構師 發表于 運動2022-07-18
簡介且普通程式碼塊的執行順序和書寫順序一致建構函式:在建立物件時呼叫,在main方法之後執行總的順序是————靜態程式碼塊>構造程式碼塊>建構函式>普通程式碼塊最後再來一個案例,驗證一下上面所講的知識是否正確(實踐是檢驗真理的

內部的類能組什麼詞

Java 類中不僅可以定義變數和方法,還可以定義類,這樣定義在類內部的類就被稱為內部類。根據定義的方式不同,內部類分為四大類靜態內部類,成員內部類,區域性內部類,匿名內部類四種。

但是在這之前我想先講下類的載入順序,所謂磨刀不誤砍柴工嘛,先把基礎溫習溫習

1。類的載入順序

一個類在java編譯器中是如何載入的,它的載入順序是如何?這些涉及到了靜態變數、靜態塊、程式碼塊、構造方法、成員變數和成員方法等等,但是有一個統一的原則——-變數定義的先後順序決定初始化順序,而在不同變數之間,又存在著某些規則(先靜態物件,再非靜態物件)

這邊大家容易混淆的是就是程式碼塊和建構函式,程式碼塊包括三個:

1。靜態程式碼塊:使用static關鍵字和{}宣告的程式碼塊(不能存在於方法中,是所屬於類的)

執行時機:靜態程式碼塊在類被載入的時候就運行了,而且只執行一次,並且優先於各種程式碼塊以及建構函式。如果一個類中有多個靜態程式碼塊,會按照書寫順序依次執行

作用:一般情況下,如果有些程式碼需要在專案啟動的時候就執行,這時候就需要靜態程式碼塊。比如一個專案啟動需要載入的很多配置檔案等資源,我們就可以都放入靜態程式碼塊中。

2。構造程式碼塊:和靜態程式碼塊的區別是少了static關鍵字

執行時機:構造程式碼塊在建立物件時被呼叫,每次建立物件都會呼叫一次,但是優先於建構函式執行。需要注意的是,聽名字我們就知道,構造程式碼塊不是優先於建構函式執行,而是依託於建構函式,也就是說,如果你不例項化物件,構造程式碼塊是不會執行的

作用:和建構函式的作用類似,都能對物件進行初始化,並且只要每建立一個物件,構造程式碼塊都會執行一次。但是反過來,建構函式則不一定每個物件建立時都執行(多個建構函式情況下,建立物件時傳入的引數不同則初始化使用對應的建構函式)。

利用每次建立物件的時候都會提前呼叫一次構造程式碼塊特性,我們可以做諸如統計建立物件的次數等功能。

3。普通程式碼塊:普通程式碼塊和構造程式碼塊的區別是,構造程式碼塊是在類中定義的,而普通程式碼塊是在方法體中定義的。且普通程式碼塊的執行順序和書寫順序一致

建構函式:在建立物件時呼叫,在main方法之後執行

總的順序是————靜態程式碼塊>構造程式碼塊>建構函式>普通程式碼塊

最後再來一個案例,驗證一下上面所講的知識是否正確(實踐是檢驗真理的唯一標準,哈哈)

public

class

CodeBlock

{

static

{

System。

out

。println(

“靜態程式碼塊”

);

}

public

CodeBlock

{

System。

out

。println(

“無參建構函式”

);

}

{

System。

out

。println(

“構造程式碼塊”

);

}

public

void

sayHello

{

{

System。

out

。println(

“普通程式碼塊”

);

}

}

public

static

void

main

String[] args

{

System。

out

。println(

“執行了main方法”

);

new

CodeBlock()。sayHello();;

}

}

idea執行截圖1

java內部類及類載入順序

2。關於父子類的載入順序

1。首先執行父類的靜態內容(包括靜態變數和靜態程式碼塊),再去執行子類的靜態內容(若子類沒有直接下一步),執行完之後進入下一步

2。如果有就執行父類的構造程式碼塊,父類的構造程式碼塊執行完畢,接著執行父類的構造方法;父類的構造方法執行完畢之後,它接著去看子類有沒有構造程式碼塊,如果有就執行子類的構造程式碼塊。子類的構造程式碼塊執行完畢再去執行子類的構造方法。

3。再來驗證一下。

package com。tys。extend;

public

class

SuperClass

{

static

{

System。

out

。println(

“父類靜態程式碼塊”

);

}

{

System。

out

。println(

“父類構造程式碼塊”

);

}

public

SuperClass

{

System。

out

。println(

“父類建構函式”

);

}

public

static

void

main

String[] args

{

SubClass sb =

new

SubClass();

System。

out

。println(

“——————”

);

SubClass sb1 =

new

SubClass();

}

}

class

SubClass

extends

SuperClass

{

static

{

System。

out

。println(

“子類靜態程式碼塊”

);

}

{

System。

out

。println(

“子類構造程式碼塊”

);

}

public

SubClass

{

System。

out

。println(

“子類建構函式”

);

}

}

idea執行截圖2

java內部類及類載入順序

從上圖我們new了兩個物件,但是因為靜態變數只加載一次,所以new第二個物件的時候,不會再去調了

3 內部類的載入時序

內部類:內部類是延時載入的,也就是說只會在第一次使用時載入。不使用就不載入。由此,可以很好的用於單例模式(不使用不載入:避免了餓漢式的記憶體浪費;可巧妙避免執行緒安全問題)

java內部類及類載入順序

推薦文章

  • 轉龍平安福喜迎研學小團隊 花道人間·水尚飄樂園明天開業

    孩子們不僅可與張牙舞爪的恐龍近距離接觸,而且還可以進入懸掛於空中的帳篷內進行露營,俯覽整個水尚飄樂園...

  • 《琉璃美人煞》神裝鳥王自信嘲諷,女戰神嗔怒,淨氣瓶好坑

    嘲諷玩得好,有時候也會被坑的,面對禹司鳳的一張靈活嘴巴,褚璇璣也是不耐煩了,她已經受夠了這些話,直接是扔過去一個瓶子,美其名曰是“淨氣瓶”,是用來化解人身上戾氣的,但其實璇璣只是被昊辰坑了一把,惡毒的朱雀瓶,被包裝了一下,就當寶貝用在了司鳳...

  • 煙臺:建築企業資質及安全許可申報時限減半

    市住建局圍繞“一次告知、一表申報、一窗受理、一次辦成”,透過規範事項辦理要件、合併事項申報材料、最佳化業務流程、科學配置等方式,將原建築業企業資質和建築施工企業安全生產許可證2個獨立事項的變更或登出業務最佳化整合成一件事一次辦,並對相關申報...