java中常常有一些靜態塊,這是用來在生成類以前進行的初始化,不管java還C++語言中的static,都是最早初始化好的。結構以下:
static {
靜態語句代碼塊
}
{
非靜態語句代碼塊
}
異同點
相同點:都是在JVM加載類時且在構造方法執行以前執行,在類中均可以定義多個,通常在代碼塊中對一些static變量進行賦 值。
不一樣點:靜態代碼塊在非靜態代碼塊以前執行(靜態代碼塊--》非靜態代碼塊--》構造方法)。
靜態代碼塊只在第一次new執行一次,以後不在執行,而非靜態代碼塊在每new一次就執行一次。非靜態代碼塊能夠 在普通方法中定義(我的感受做用不大);而靜態代碼塊不行。
Java代碼
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 非靜態");
}
}
Java代碼
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();
}
}
Java代碼
輸出結果以下:
Test Static 靜態語句塊
Test1 Static 靜態語句塊
Test 非靜態
Test 默認無參構造器
Test1 非靜態
Test1 默認無參構造器
小結:
一、靜態代碼塊是在類加載時自動執行的,非靜態代碼塊在建立對象自動執行的代碼,不建立對象不執行該類的非靜態代碼塊。 順序: 靜態代碼塊--》非靜態代碼塊--》類構造方法。
二、在靜態方法裏面只能直接調用同類中其餘的靜態成員(包括變量和方法),而不能直接訪問類中的非靜態成員。由於對於非靜態的方法和變量,須要先建立類的實例對象後方可以使用,而靜態方法在使用前不用建立任何對象。
三、若是某些代碼必需要在項目啓動時候就執行的時候,咱們能夠採用靜態代碼塊,這種代碼是主動執行的;須要在項目啓動的時候就初始化,在不建立對象的狀況下,其餘程序來調用的時候,須要使用靜態方法,此時代碼是被動執行的。
區別:靜態代碼塊是自動執行的;
靜態方法是被調用的時候才執行的;
做用:靜態代碼塊能夠用來初始化一些項目最經常使用的變量和對象;靜態方法能夠用做不建立對象也能夠能須要執行的代碼。java