① java static 初始化順序語法並不正確
執行到Test1.a
調用了Test1所以開始對Test1中靜態部分初始化
初始化a static int a=(new Test1()).aa();
因為new了Test1對象 所以線程執行實例化類Test1,實例代碼塊執行
之後調用int aa() , aa()執行
到這里 a的初始化完畢
又開始執行 靜態代碼塊"
最後輸出結果
你調用一個類 靜態方法塊或屬性沒有初始化的話 就進行初始化
實例化一個類 就調用構造方法實例化 並沒有什麼語法相悖啊
若static int a=(new Test1()).aa();改為static int a=10;則該程序實例初始化根本就不會執行
你有沒有實例化對象 又怎麼會執行"實例初始化"
② java 靜態變數初始化為什麼要用靜態初始化
在java中用final修飾符修飾的變數表示不可以被二次賦值,且系統不會給其賦默認值。 如果單純只是final變數,可以在定義的時候就賦默認值,也可以在構造方法中賦默認值。 但是如果同時用final static 修飾變數,因為static變數屬於類而不屬於對象,且在調用構造方法之前static 變數就已經被系統給賦默認值。而相應的final static 變數就只能在定義的時候就初始化,否則既無法在構造方法中初始化,系統又不會賦默認值,相當於這個變數被定義出來是毫無用處的。 因此java中final static變數必須初始化
③ 關於JAVA中static初始化問題
java虛擬機在首次主動使用類型的時候才會初始化(lazy-load的形式),主動使用包括以下6種情況
1. 創建類的實例
2. 調用類的靜態方法
3. 操作類的非常量靜態欄位(非final static)
4. 調用特定的反射方法
5. 初始化一個類的子類
6. 指定一個類為虛擬機啟動時的初始化類
所以說,你必須主動使用到這個類,這個類才會被初始化,這就能解釋第一次有輸出,而第二次沒有輸出的情況了
另外,值得一提的是,載入和初始化不是一個概念,比如,在main函數中寫
Table a = null;
一樣不會有輸出。。Table類被載入了但是沒有被初始化,因為這不屬於上述6種「主動使用」情況之一,不信試試。。。
④ java中對象的初始化位置是構造器,那static修飾的對象在哪初始化
一個對象的初始化過程。建議網路一下具體信息。
static修飾的變數是靜態變數,在其類被載入的時候進行初始化動作。
上圖就是類進行載入初始化時機。類只載入一次直到被卸載。
你上面的代碼,如果把main方法放到另一個class中,你會發現只列印hello。因為App這個類沒有被用到,是不會進行載入的。
類載入的准備階段會為類中的所有靜態變數按順序分配內存空間,並為其設置一個初始值。基本類型為0,引用類型是null。
類載入的初始化階段會為類中的所有靜態變數按順序(從上到下,這個順序還是比較重要的,順序不一樣結果可能就不一樣了)進行賦值操作。
⑤ 高級Java開發中什麼是靜態初始化器
靜態初始化器是由關鍵字static引導的一對大括弧括起的語句組。它的作用與類的構造函數有些相似,都用來完成初始化的工作,但是靜態初始化器與構造函數有三點根本的不同:
(1)構造函數是對每個新創建的對象初始化,而靜態初始化器是對每個類進行初始化;
(2)構造函數是在用new運算符產生新對象時由系統自動執行,而靜態初始化器則是在它所屬的類載入入內存時由系統調用運行的;
(3)不同於構造函數,靜態初始化器不是方法,沒有方法名、返回值和參數列表。
⑥ java 中靜態內部類欄位什麼時候初始化是在外部類載入的時候就初始化嗎
首先分析下名字:靜態內部類
靜態是static。靜態的方法或者參數是隨著類的載入而產生的(感覺應該是JVM啟動時static屬性就載入了。)。這就是為什麼不用實例化類,就可以調用它的原因。
內部類:用內部類是因為內部類與所在外部類有一定的關系,往往只有該外部類調用此內部類。其他類不會調用。所以沒必要另寫一個類。外部類可以調用內部類。而內部類不能調用外部類的方法。
所以我覺得
靜態內部類中的屬性,方法,是在外部類載入的時候初始化的。
希望對您有幫助。如果有問題請自行
谷歌
度娘.