A. 關於java中static初始化問題
java虛擬機在首次主復動使用類型制的時候才會初始化(lazy-load的形式),主動使用包括以下6種情況
1. 創建類的實例
2. 調用類的靜態方法
3. 操作類的非常量靜態欄位(非final static)
4. 調用特定的反射方法
5. 初始化一個類的子類
6. 指定一個類為虛擬機啟動時的初始化類
所以說,你必須主動使用到這個類,這個類才會被初始化,這就能解釋第一次有輸出,而第二次沒有輸出的情況了
另外,值得一提的是,載入和初始化不是一個概念,比如,在main函數中寫
Table a = null;
一樣不會有輸出。。Table類被載入了但是沒有被初始化,因為這不屬於上述6種「主動使用」情況之一,不信試試。。。
B. java類中的靜態變數是什麼時候初始化的
靜態方法是你手動調用的時候執行。
靜態變數與類一起載入,最優先的。
然後是,靜態初始化器(只初始化靜態成員變數)。
然後是,屬性初始化(只初始化非靜態成員變數)。
最後是,構造函數(常用的,你懂的)...
記住:先是靜態,然後是非靜態。
C. java初始化中靜態方法得初始化嗎何時初始化 一般方法得初始化嗎何時初始化
static變數初始值一定要是常量。static變數中文名叫靜態變數。它與普通的變數比起來有如下幾個區別:版權1)位置:靜態局部變數被編譯器放在全局存儲區.data,所以它雖然是局部的,但是在程序的整個生命周期中存在。
D. Java類的初始化是什麼時候
我們知道一個類(class)要被使用必須經過裝載,連接,初始化這樣的過程。下面先對這三階段做一個簡單的描述,之後會結合一個簡單的例子來說明java中類的初始化過程。
在裝載階段,類裝載器(Bootstrap ClassLoader 或者用戶自定義的ClassLoader) 把編譯形成的class文件載入內存,創建類相關的Class對象,這個Class對象封裝了我們要使用的類的類型信息。
連接階段又可以分為三個子步驟:驗證、准備和解析。
驗證就是要確保java類型數據格式 的正確性,並適於JVM使用。
准備階段,JVM為靜態變數分配內存空間,並設置默認值,注意,這里是設置默認值,比如說int型的變數會被賦予默認值0 。在這個階段,JVM可能還會為一些數據結構分配內存,目的 是提高運行程序的性能,比如說方法表。
解析過程就是在類型的常量池中尋找類、介面、欄位和方法的符號引用,把這些符號引用替換成直接引用。這個階段可以被推遲到初始化之後,當程序運行的過程中真正使用某個符號引用的時候 再去解析它。
類會在首次被「主動使用」時執行初始化,為類(靜態)變數賦予正確的初始值。在Java代碼中,一個正確的初始值是通過類變數初始化語句或者靜態初始化塊給出的。而我們這里所說的主動使用 包括:
1. 創建類的實例
2. 調用類的靜態方法
3. 使用類的非常量靜態欄位
4. 調用Java API中的某些反射方法
5. 初始化某個類的子類
6. 含有main()方法的類啟動時
初始化一個類包括兩個步驟:
1、 如果類存在直接父類的話,且直接父類還沒有被初始化,則先初始化其直接父類
2、 如果類存在一個初始化方法,就執行此方法
註:初始化介面並不需要初始化它的父介面。
E. java靜態初始化器對什麼進行初始化
java靜態初始化器對static進行初始化。
所謂的靜態和動態是相對於程序運行是而言的,靜態是在程序編譯時就初始化好了的,動態初始化是在程序運行是才動態分配內存空間。
static變數初始值一定要是常量。static變數中文名叫靜態變數。位置靜態局部變數被編譯器放在全局存儲區.data,所以它雖然是局部的,但是在程序的整個生命周期中存在。
作用:
對於靜態全局變數來說,針對某一源文件的以static聲明的文件級變數與函數的作用域只限於文件內(只在文件內可見),也即「內部連接」,因而可以用來限定變數的作用域。
對於靜態局部變數來說,在函數內以static聲明的變數雖然與自動局部變數的作用域相同(即作用域都只限於函數內)。
但存儲空間是以靜態分配而非默認的自動分配方式獲取的,因而存儲空間所在區域不同,且兩次調用間變數值始終保持一致;必須注意,靜態局部變數只能初始化一次,這是由編譯器來保證實現。
對於靜態成員變數來說,在C++中,在類的定義中以static聲明的成員變數屬於類變數,也即在所有類實例中共享,與之相對的就是過程變數。
F. Java的靜態塊和初始化塊分別何時執行有什麼區別
靜態初始化塊:當類第一次載入時執行。
非靜態初始化塊:非靜態初始化塊會在構造函專數執行時屬,且在構造函數主體代碼執行之前被執行。
區別如下:
1、執行次數不同
靜態塊只執行一次,初始化塊可以執行多次。
2、作用不同
靜態初始化塊僅能初始化類變數,即static修飾的數據成員。
非靜態初始化塊可以初始化類的實例變數。
(6)java靜態類初始化擴展閱讀:
使用Java靜態代碼塊注意事項:
1、它是隨著類的載入而執行,只執行一次,並優先於主函數。具體說,靜態代碼塊是由類調用的。類調用時,先執行靜態代碼塊,然後才執行主函數的。
2、靜態代碼塊其實就是給類初始化的,而構造代碼塊是給對象初始化的。
3、靜態代碼塊中的變數是局部變數,與普通函數中的局部變數性質沒有區別。
4、一個類中可以有多個靜態代碼塊。
5、對於靜態變數、靜態初始化塊、變數、初始化塊、構造器,它們的初始化順序依次是(靜態變數、靜態初始化塊)>(變數、初始化塊)>構造器。
G. java 中靜態內部類欄位什麼時候初始化是在外部類載入的時候就初始化嗎
首先分析下名字:靜態內部類
靜態是static。靜態的方法或者參數是隨著類的載入而產生的(感覺應該是JVM啟動時static屬性就載入了。)。這就是為什麼不用實例化類,就可以調用它的原因。
內部類:用內部類是因為內部類與所在外部類有一定的關系,往往只有該外部類調用此內部類。其他類不會調用。所以沒必要另寫一個類。外部類可以調用內部類。而內部類不能調用外部類的方法。
所以我覺得
靜態內部類中的屬性,方法,是在外部類載入的時候初始化的。
希望對您有幫助。如果有問題請自行
谷歌
度娘.