標籤:
首先有三個概念需要瞭解:
一.靜態初始化:是指執行靜態初始化塊裡面的內容。
二.執行個體初始化:是指執行執行個體初始化塊裡面的內容。
三.構造方法:一個名稱跟類的名稱一樣的方法,特殊在於不帶傳回值。
我們先來看一段程式結果:
package com; class Book{ public static int booksum=0;//靜態變數 static{//這是靜態初始化塊 print(); System.out.println("this is static block"); } {//執行個體初始化塊 System.out.println("初始化塊:"+booksum); } public Book(){//構造方法 System.out.println("this is Book‘s constructor~"); booksum+=1; } public static void print(){//靜態方法 System.out.println("this is static method~"); } public static void main(String []args){ //Book book=new Book(); } }
執行結果:
this is static method~
this is static block
如果把
public static void main(String []args){ //Book book=new Book(); }
的注釋去掉的話,運行結果為:
this is static method~
this is static block
初始化塊:0
this is Book‘s constructor~
總結:
僅從代碼執行的角度來探討Java載入類、建立對象的過程,並沒有深入到JVM的機制中去。
1.一個對象第一次被建立時,先要載入該對象所屬的類,即對應的.class檔案,當然如果類已經載入,再次建立該類的對象時,就不再需要重新載入類了。而一個類載入的時候,有三個部分需要載入,一個是靜態變數,再然後是靜態方法,然後是靜態初始化塊。 (見到第一次執行結果就知道了,由於沒有建立執行個體所以初始化塊不執行)
2.然後開始建立該類的執行個體了,當然如果靜態方法跟靜態初始化對象中有對象的建立時,就繼續載入該對象的類,當然已經載入了該對象的類的話就不需要再次加 載了。那麼對象執行個體的建立過程是什麼呢?首先是成員變數的引入,然後是執行個體初始化塊,之後才是構造方法,構造方法執行完成之後才算把這個對象給建立出來了。
在這個過程中,真正可以編寫執行代碼的地方有三個,靜態初始化、執行個體初始化以及構造方法。從以上的分析中我們可以看到,這三個代碼塊的執行順序是先類的靜態初始化,再執行個體初始化,最後執行構造方法。也就是說,靜態初始化是屬於類載入的過程,所以它只執行一次,而執行個體初始化是每個對象建立時都會執行一次,而構造方法跟執行個體初始化其實也差不多,不過它在執行個體初始化之後執行,而且構造方法可以重載多個,執行哪個構造方法是根據你的選擇來的。
可以把main () 函數加一條語句看看:
public static void main(String []args){ Book book=new Book(); Book book1=new Book(); }
此時執行結果為:
this is static method~
this is static block
初始化塊:0
this is Book‘s constructor~
初始化塊:1
this is Book‘s constructor~
這說明執行個體初始化是每個對象建立時都會執行的。
Java靜態初始化,執行個體初始化以及構造方法