分析乙個類的初始化及執行順序大概可以按照如下步驟:
1.確定類變數的初始值。
在類載入的準備階段,jvm 會為類變數初始化零值,這時候類變數會有乙個初始的零值。如果是被 final 修飾的類變數,則直接會被初始成使用者想要的值。
2.初始化入口方法。
當進入類載入的初始化階段後,jvm 會尋找整個 main 方法入口,從而初始化 main 方法所在的整個類。當需要對乙個類進行初始化時,會首先初始化類構造器(),之後初始化物件構造器()。
3.初始化類構造器。
jvm 會按順序收集類變數的賦值語句、靜態**塊,最終組成類構造器由 jvm 執行。
4.初始化物件構造器。
jvm 會按照收集成員變數的賦值語句、普通**塊,最後收集構造方法,將它們組成物件構造器,最終由 jvm 執行。
注意:如果在初始化 main 方法所在類的時候遇到了其他類的初始化,那麼就先載入對應的類,載入完成之後返回。如此反覆迴圈,最終返回 main 方法所在類。
下面先看乙個簡單的例子:
class grandpa
public grandpa()
}class father extends grandpa
public father()
}class son extends father
public son()
}public class initializationdemo
}輸出結果是:
爺爺在靜態**塊
爸爸在靜態**塊
兒子在靜態**塊
我是爺爺~
我是爸爸~
我是兒子~
再來看乙個複雜一點的例子:
public class book
static book book = new book();
static
book()
public static void staticfunction()
int price = 110;
static int amount = 112;
} 他的輸出結果為:
書的普通**塊
書的構造方法
price=110,amount=0
書的靜態**塊
書的靜態方法
執行過程:
當 jvm 在準備階段的時候,便會為類變數分配記憶體和進行初始化。此時,我們的 book 例項變數被初始化為 null,amount 變數被初始化為 0。
當進入初始化階段後,因為 book 方法是程式的入口,使用者指定乙個要執行的主類(包含main()方法的那個類),虛擬機會先初始化這個主類)。所以jvm 會初始化 book 類,即執行類構造器 。
jvm 對 book 類進行初始化首先是執行類構造器(按順序收集類中所有靜態**塊和類變數賦值語句就組成了類構造器 ),後執行物件的構造器(按順序收集成員變數賦值和普通**塊,最後收集物件構造器,最終組成物件構造器 )。
對於 book 類,其類構造方法()可以簡單表示如下:
static book book = new book();
static
static int amount = 112;
於是首先執行static book book = new book();這一條語句,這條語句又觸發了類的例項化。於是 jvm 執行物件構造器 ,收集後的物件構造器 **:
int price = 110;
book()
於是此時 price 賦予 110 的值,輸出:「書的普通**塊」、「書的構造方法」。而此時 price 為 110 的值,而 amount 的賦值語句並未執行,所以只有在準備階段賦予的零值,所以之後輸出「price=110,amount=0」。
當類例項化完成之後,jvm 繼續進行類構造器的初始化:
static book book = new book();
static
static int amount = 112;
即輸出:「書的靜態**塊」,之後對 amount 賦予 112 的值。
到這裡,類的初始化已經完成,jvm 執行 main 方法的內容。
public static void main(string args)
即輸出:「書的靜態方法」。
加油吧,程式設計師!
乙個關於JAVA類載入機制的面試題目
class singleton public static singleton getinstance public class test 錯誤答案 count1 1 count2 1 正確答案 count1 1 count2 0 根據本體來分析類載入的過程 1 singleton singleto...
Java面試題(一)
1 1 2 3 100構建乙個函式。答案 public int sum int n 2 描述冒泡演算法。答案 基本思路 對尚未排序的各元素從頭到尾依次比較相鄰的兩個元素是否逆序 與欲排順序相反 若逆序就交換這兩元素,經過第一輪比較排序後便可把最大 或最小 的元素排好,然後再用同樣的方法把剩下的元素逐...
java面試題總結
今天被架構師問了一連串的問題,估計問了有乙個多小時吧,有很多問題都答不上來,突然發現原來自己沒有掌握的知識太多了,原來我覺得技術是用來解決問題的,而不是用來研究的,但現在覺得要更快捷的解決問題,還得好好的研究他們的原理,凡事多問個 他的原理是什麼,底層是怎麼實現的 回來好好整理了一下知識點,我想就每...