static 塊僅在該類被載入時執行一次
classUseStatic{
staticinta=3;
staticintb;
staticvoidmeth(intx){
System.out.println("x="+x);
System.out.println("a="+a);
System.out.println("b="+b);
}
static{
System.out.println("Staticblockinitialized.");
b=a*4;
}
publicstaticvoidmain(Stringargs[]){
meth(42);
}
}
一旦UseStatic 類被裝載,所有的static語句被運行。首先,a被設置為3,接著static 塊執行(列印一條消息),最後,b被初始化為a*4 或12。然後調用main(),main() 調用meth() ,把值42傳遞給x。3個println ( ) 語句引用兩個static變數a和b,以及局部變數x 。 注意:在一個static 方法中引用任何實例變數都是非法的。
下面是該程序的輸出:
Static block initialized.
x = 42
a = 3
b = 12
2. Java的靜態塊和初始化塊分別何時執行有什麼區別
靜態初始化塊:當類第一次載入時執行。
非靜態初始化塊:非靜態初始化塊會在構造函數執行時,且在構造函數主體代碼執行之前被執行。
區別如下:
1、執行次數不同
靜態塊只執行一次,初始化塊可以執行多次。
2、作用不同
靜態初始化塊僅能初始化類變數,即static修飾的數據成員。
非靜態初始化塊可以初始化類的實例變數。
(2)java代碼塊執行順序擴展閱讀:
使用Java靜態代碼塊注意事項:
1、它是隨著類的載入而執行,只執行一次,並優先於主函數。具體說,靜態代碼塊是由類調用的。類調用時,先執行靜態代碼塊,然後才執行主函數的。
2、靜態代碼塊其實就是給類初始化的,而構造代碼塊是給對象初始化的。
3、靜態代碼塊中的變數是局部變數,與普通函數中的局部變數性質沒有區別。
4、一個類中可以有多個靜態代碼塊。
5、對於靜態變數、靜態初始化塊、變數、初始化塊、構造器,它們的初始化順序依次是(靜態變數、靜態初始化塊)>(變數、初始化塊)>構造器。
3. java,靜態方法為什麼不能調用類成員
樓主想問的應該是不用調用成員變數吧
首先,這涉及到代碼執行優先順序的問題,在一個Java類中,存在的代碼形式有靜態代碼塊(花括弧{}包裹住的代碼片段),靜態方法,構造函數,成員方法。不同形式的代碼執行順序不同:
1、靜態代碼塊:當類被載入時,靜態代碼塊被執行,且只被執行一次,靜態代碼塊常用來執行類屬性的初始化。
2、靜態方法(也叫類方法):在類載入的時候,在不創建對象的情況下執行,可以直接用類名調用。
兩者的區別是靜態代碼塊是主動執行的,靜態方法是被動執行,只有被調用時才執行。
3、構造函數在創建對象的時候執行。
4、成員方法在被調用的時候執行。
總結:Java代碼執行先後順序:靜態代碼塊>靜態方法>構造函數=非靜態代碼塊。
在了解執行順序後,樓主的問題就很容易解答了。
從層級上看,靜態方法屬於類級別,成員變數屬於對象級別。同時靜態方法也先於構造函數執行,內存也沒給類成員分配空間,說白就是都不存在,你靜態方法調用一個不存在的變數肯定不行的呀。
4. Java類的實例化順序是什麼樣的Java線程同步的方式有哪些
引言:java是在1990年初 ,被詹姆斯•高斯林等人開發的一門面向對象的編程語言。起初,java被稱為0ak,來經過發展0ak改名為java,與1995年的五月份正式向大家發布。
java的實例化順序在繼承沒有的情況
單獨一個類的場景下,初始化順序為依次為靜態數據,繼承的基類的構造函數,成員變數,被調用的構造函數。
其中靜態數據只會初始化一次。(靜態數據包括靜態代碼塊和靜態變數,每個類的靜態數據只會初始化一次)
在繼承的情況下
添加兩個基類,讓繼承父親,父親繼承祖父。
繼承的情況就比較復雜了。由繼承了基類,還將往上回溯,遞歸地調用基類的無參構造方法。
在我們的例子中,在初始化靜態數據後,會先往上追溯,調用父的默認構造方法,此時再往上追溯到爺爺的默認構造方法。
無論是java還是什麼別的東西他都體現了現代社會與信息技術的不斷發展,人們在進行進行技術開發時也有了越來越多的方法。程序類的工作也有了更為快捷的方法,這為信息技術的發展也提供了更好的發展方法
5. java 調用靜態方法和構造函數和靜態塊執行的先後順序
java中首先是靜態塊先執行,靜態方法,最後是構造函數。示例如下:
publicclassExA{
static{
System.out.println("父類--靜態代碼塊");
}
publicExA(){
System.out.println("父類--構造函數");
}
{
System.out.println("父類--非靜態代碼塊");
}
publicstaticvoidmain(String[]args){
newExB();
}
}
classExBextendsExA{
static{
System.out.println("子類--靜態代碼塊");
}
{
System.out.println("子類--非靜態代碼塊");
}
publicExB(){
System.out.println("子類--構造函數");
}
}
執行結果
=====
父類--靜態代碼塊
子類--靜態代碼塊
父類--非靜態代碼塊
父類--構造函數
子類--非靜態代碼塊
子類--構造函數