Java初始化問題

2021-08-19 18:17:03 字數 2017 閱讀 7602

類載入機制

一、對於被static修飾的類變數

1.被final修飾。在準備階段給類變數申請記憶體空間的同時就通過constantvalue屬性進行初始化,在呼叫此變數的時候,不會對此類進行初始化。

2.未被final修飾。在初始化階段進行了初始化,通過類構造器()方法進行初始化,只在類使用之前呼叫一次。

被動引用的情況:

<1> 通過子類呼叫父類的靜態欄位和靜態方法時,只初始化父類,而不初始化子類。(不會執行子類構造器()方法

結果:

<2>被final修飾的static變數,不會對此靜態字段所屬的類進行初始化。

<3>通過陣列定義此類,不會觸發此類的初始化

注:[[lcn.hyy.test.classloading.superclass 此類代表乙個元素型別為cn.hyy.test.classloading.superclass的二維陣列,左邊中括號的個數代表維數。

二、對於未被static修飾的例項變數

當初始化乙個類時,若其父類還未初始化,則需要對其父類進行初始化。

1.通過new乙個物件呼叫例項構造器()方法。

通過new

關鍵字例項化物件時,既會呼叫例項構造方法()方法,完成對物件的初始化。當子類之前未曾使用時,也會觸發子類以及父類的初始化(執行子類和父類的類構造器()方法)。

2.通過反射獲得物件時,若類未進行初始化,會觸發子類以及父類的初始化(執行子類和父類的類構造器()方法)。

3.呼叫子類的靜態欄位和靜態方法時,若類未進行初始化,會觸發子類和父類的初始化(執行子類和父類的類構造器()方法)。

1.類構造器()方法

由編譯器自動收集類中所有類變數的賦值動作和靜態語句塊static{}中的語句合併產生的。

編譯器收集的順序是由語句在原始檔中出現的順序所決定的,靜態語句塊只能訪問到定義在靜態語句塊之前定義的變數,定義在它之後的變數,在前面的靜態語句塊可以賦值,但不能訪問。

2.例項構造器()方法

由類的構造方法和{}語句塊合併而成。

當未對類進行定義構造方法時,jdk會產生乙個隱藏的無參構造方法,若此類有繼承類,被繼承的類也會有乙個隱藏的無參構造方法,在子類的構造方法中會隱式呼叫super()來執行父類的無參構造方法。

JAVA初始化問題1

class test1 public final static string a sss public class test public static void main string args 執行結果 sss呼叫類的final成員不會引發類的初始化操作,所以static語法塊不會被執行 當st...

java 變數的初始化問題

類變數 類靜態成員 類被載入時產生 它的生存期是類的生存期 自動初始化 類被載入 成員變數 類成員 在使用new建立該類例項時產生 它的生存期與該類例項物件的生存期相同 自動初始化 構造方法被呼叫 區域性變數 類的方法中的變數 該方法被呼叫時產生 在該方法退出後結束 必須顯式初始化 1 方法中的變數...

java中靜態初始化問題

class bowl public void f1 int maker class table public void f2 int maker static bowl bowl2 new bowl 2 class cupboard public void f3 int maker static b...