Java基礎 靜態塊、非靜態塊、建構函式的執行順序,java建構函式

來源:互聯網
上載者:User

Java基礎 靜態塊、非靜態塊、建構函式的執行順序,java建構函式

Java中經常有一些靜態塊,這是用來在產生類之前進行的初始化,無論java還C++語言中的static,都是最先初始化好的。結構如下: 
static { 
靜態語句代碼塊 



非靜態語句代碼塊 

異同點 
相同點:都是在JVM載入類時且在構造方法執行之前執行,在類中都可以定義多個,一般在代碼塊中對一些static變數進行賦值。 
不同點:靜態代碼塊在非靜態代碼塊之前執行(靜態代碼塊-->非靜態代碼塊-->建構函式)。 
靜態代碼塊只在第一次new(或者只要訪問了就)執行一次,之後不在執行,而非靜態代碼塊在每new一次都會執行一次,跟建構函式一樣。非靜態代碼塊可以在普通方法中定義(個人感覺作用不大);而靜態代碼塊不行。 

Java代碼  

public class TestStatic {    static {        System.out.println("基類 Static 靜態語句塊");    }    public TestStatic() {        System.out.println("基類  預設無參構造器");    }    {        System.out.println("基類 非靜態語句塊");    }    public static void Iint() {        System.out.println("基類 Static Iint");    }}



public class User extends TestStatic {    private static final long serialVersionUID = 1L;    public final double i = Math.random();// 每次得到的結果不一樣    private final static int finalID;    private static int finalID2;    private int finalID3;        static  {         System.out.println("衍生類別 Static 靜態語句塊");         finalID=1000;    }        {        System.out.println("衍生類別  非靜態語句塊");          finalID2+=1;        finalID3+=1;    }        /** full constructor */    public User() {        System.out.println("衍生類別  預設無參構造器");              }    public static void IintTest() {        System.out.println("衍生類別 Static Iint");    }}

測試語句1 

public static void main(String[] args) {  
        TestStatic.Iint();//User.Iint();
    }  

輸出結果如下:

基類 Static 靜態語句塊
衍生類別 Static 靜態語句塊
基類 Static Iint

測試說明了靜態代碼塊不管怎麼樣都會被執行,調用基類的靜態方法,衍生類別的靜態語句塊也都執行了,調用這個User.Iint(); 也是一樣的結果 。

測試語句2 

public static void main(String[] args) {  
        TestStatic.Iint();//User.Iint();
         User.IintTest();
    }  

輸出結果如下:

基類 Static 靜態語句塊
衍生類別 Static 靜態語句塊
基類 Static Iint
衍生類別 Static Iint

測試說明了 靜態語句塊執行一次,只是調用了衍生類別的靜態方法被執行了

測試語句3

public static void main(String[] args) {         

TestStatic.Iint();//User.Iint();
User.IintTest();
System.out.println(User.finalID);
TestStatic user = new User();

    }  

執行結果如下:

基類 Static 靜態語句塊
衍生類別 Static 靜態語句塊
基類 Static Iint
衍生類別 Static Iint
1000
基類 非靜態語句塊
基類 預設無參構造器
衍生類別 非靜態語句塊
衍生類別 預設無參構造器

測試說明了 非靜態代碼塊在每new一次都會執行一次,跟建構函式一樣的次數

測試語句4

public static void main(String[] args) {  

TestStatic.Iint();//User.Iint();
User.IintTest();
System.out.println(User.finalID);
TestStatic user = new User();


System.out.println();
System.out.println("第二次初始化衍生類別");
User user2 = new User();


System.out.println();
System.out.println("第三次次初始化基類");
TestStatic user3 = new TestStatic ();

}

執行結果如下:

基類 Static 靜態語句塊
衍生類別 Static 靜態語句塊
基類 Static Iint
衍生類別 Static Iint
1000
基類 非靜態語句塊
基類 預設無參構造器
衍生類別 非靜態語句塊
衍生類別 預設無參構造器

第二次初始化衍生類別
基類 非靜態語句塊
基類 預設無參構造器
衍生類別 非靜態語句塊
衍生類別 預設無參構造器

第三次次初始化基類
基類 非靜態語句塊
基類 預設無參構造器

測試說明了靜態代碼塊在非靜態代碼塊之前執行(靜態代碼塊-->非靜態代碼塊-->建構函式)。 
靜態代碼塊只在第一次new(或者只要訪問了就)執行一次,之後不在執行,而非靜態代碼塊在每new一次都會執行一次,跟建構函式一樣.


小結: 
1、靜態代碼塊是在類載入時自動執行的,非靜態代碼塊在建立對象自動執行的代碼,不建立對象不執行該類的非靜態代碼塊。 順序: 靜態代碼塊--》非靜態代碼塊--》類建構函式。 
2、在靜態方法裡面只能直接調用同類中其他的靜態成員(包括變數和方法),而不能直接存取類中的非靜態成員。因為對於非靜態方法和變數,需要先建立類的執行個體對象後方可使用,而靜態方法在使用前不用建立任何對象。 
3、如果某些代碼必須要在項目啟動時候就執行的時候,我們可以採用靜態代碼塊,這種代碼是主動執行的;需要在項目啟動的時候就初始化,

    在不建立對象的情況下,其他程式來調用的時候,需要使用靜態方法,此時代碼是被動執行的。 
區別:靜態代碼塊是自動執行的; 
靜態方法是被調用的時候才執行的; 
作用:靜態代碼塊可以用來初始化一些項目最常用的變數和對象;靜態方法可以用作不建立對象也可以能需要執行的代碼。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.