您現在的位置是:首頁 > 運動
java內部類及類載入順序
內部的類能組什麼詞
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
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
從上圖我們new了兩個物件,但是因為靜態變數只加載一次,所以new第二個物件的時候,不會再去調了
3 內部類的載入時序
內部類:內部類是延時載入的,也就是說只會在第一次使用時載入。不使用就不載入。由此,可以很好的用於單例模式(不使用不載入:避免了餓漢式的記憶體浪費;可巧妙避免執行緒安全問題)
推薦文章
- 轉龍平安福喜迎研學小團隊 花道人間·水尚飄樂園明天開業
孩子們不僅可與張牙舞爪的恐龍近距離接觸,而且還可以進入懸掛於空中的帳篷內進行露營,俯覽整個水尚飄樂園...
- 《琉璃美人煞》神裝鳥王自信嘲諷,女戰神嗔怒,淨氣瓶好坑
嘲諷玩得好,有時候也會被坑的,面對禹司鳳的一張靈活嘴巴,褚璇璣也是不耐煩了,她已經受夠了這些話,直接是扔過去一個瓶子,美其名曰是“淨氣瓶”,是用來化解人身上戾氣的,但其實璇璣只是被昊辰坑了一把,惡毒的朱雀瓶,被包裝了一下,就當寶貝用在了司鳳...
- 煙臺:建築企業資質及安全許可申報時限減半
市住建局圍繞“一次告知、一表申報、一窗受理、一次辦成”,透過規範事項辦理要件、合併事項申報材料、最佳化業務流程、科學配置等方式,將原建築業企業資質和建築施工企業安全生產許可證2個獨立事項的變更或登出業務最佳化整合成一件事一次辦,並對相關申報...