靜態代碼塊
靜態代碼塊只在類加載時執行一次
public class Test {
static{
System.out.println("靜態代碼塊");
}
public static void main(String[] args) {
}
//運行時會對這個Test類進行加載,即會執行static中的語句
}
非靜態代碼塊每次創建對象時都會執行
public class Test {
{
System.out.println("非靜態代碼塊");
}
public static void main(String[] args) {
new Test();
new Test();
}
//加載此類是不執行,只有創建此類的一個對象時才執行
}
靜態與非靜態代碼塊的相互調用
由於static(靜態)修飾的Java元素(成員變量、方法、代碼塊)早於非static(非靜態)修飾的Java元素分配地址空間
故靜態方法或代碼塊中不能“直接”使用非靜態元素(尚未分配地址無法使用)
但可以通過創建一個對象來間接使用成員變量
而非靜態的Java元素則可以直接使用靜態元素
package soon;
public class Test {
private String name = "Jim";
static {
System.out.println("靜態代碼塊");
//System.out.println(name);靜態代碼塊不能直接調用非靜態的元素
System.out.println(new Test().name);//但可以通過創建對象來間接調用非靜態元素
}
public static void test(){
//System.out.println(name);靜態方法不能直接調用非靜態的元素
System.out.println(new Test().name);
}
{
System.out.println("非靜態代碼塊");
}
public static void main(String[] args) {
new Test().test();
}
}
輸出結果:
靜態代碼塊
非靜態代碼塊
Jim
非靜態代碼塊
非靜態代碼塊
Jim