java中經常有一些靜態塊,這是用來在生成類之前進行的初始化,無論java還C++語言中的static,都是最先初始化好的。結構如下:
static {
靜態語句代碼塊
}
{
非靜態語句代碼塊
}
異同點
相同點:都是在JVM加載類時且在構造方法執行之前執行,在類中都可以定義多個,一般在代碼塊中對一些static變量進行賦 值。
不同點:靜態代碼塊在非靜態代碼塊之前執行(靜態代碼塊--》非靜態代碼塊--》構造方法)。
靜態代碼塊只在第一次new執行一次,之後不在執行,而非靜態代碼塊在每new一次就執行一次。非靜態代碼塊可以 在普通方法中定義(個人感覺作用不大);而靜態代碼塊不行。
package com.sample.client;
public class Test {
public int a;
static {
System.out.println("Test Static 靜態語句塊");
}
public Test() {
System.out.println("Test 默認無參構造器");
}
{
System.out.println("Test 非靜態");
}
}
package com.sample.client;
public class Test1 extends Test {
public int i;
public double d;
static {
System.out.println("Test1 Static 靜態語句塊");
}
public Test1 () {
System.out.println("Test1 默認無參構造器");
}
{
System.out.println("Test1 非靜態");
}
public static void main(String[] args) {
Test1 t = new Test1();
}
}
輸出結果如下:
Test Static 靜態語句塊
Test1 Static 靜態語句塊
Test 非靜態
Test 默認無參構造器
Test1 非靜態
Test1 默認無參構造器
小結:
1、靜態代碼塊是在類加載時自動執行的,非靜態代碼塊在創建對象自動執行的代碼,不創建對象不執行該類的非靜態代碼塊。 順序: 靜態代碼塊--》非靜態代碼塊--》類構造方法。
2、在靜態方法裏面只能直接調用同類中其他的靜態成員(包括變量和方法),而不能直接訪問類中的非靜態成員。因爲對於非靜態的方法和變量,需要先創建類的實例對象後方可使用,而靜態方法在使用前不用創建任何對象。
3、如果某些代碼必須要在項目啓動時候就執行的時候,我們可以採用靜態代碼塊,這種代碼是主動執行的;需要在項目啓動的時候就初始化,在不創建對象的情況下,其他程序來調用的時候,需要使用靜態方法,此時代碼是被動執行的。
區別:靜態代碼塊是自動執行的;
靜態方法是被調用的時候才執行的;
作用:靜態代碼塊可以用來初始化一些項目最常用的變量和對象;靜態方法可以用作不創建對象也可以能需要執行的代碼。