Java面試題之 類載入機制

2021-08-20 20:32:01 字數 2114 閱讀 9186

分析乙個類的初始化及執行順序大概可以按照如下步驟:

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面試題總結

今天被架構師問了一連串的問題,估計問了有乙個多小時吧,有很多問題都答不上來,突然發現原來自己沒有掌握的知識太多了,原來我覺得技術是用來解決問題的,而不是用來研究的,但現在覺得要更快捷的解決問題,還得好好的研究他們的原理,凡事多問個 他的原理是什麼,底層是怎麼實現的 回來好好整理了一下知識點,我想就每...