建立一個類的時候java的執行順序
阿新 • • 發佈:2019-02-14
當我們建立在一個類的時候,java在做那些事情,順序是什麼
<span style="font-size:14px;">public class text { private int i=8; private int k=9; static int j=8; static { j=8; System.out.println(j); } public text(int k){ this.k=k; System.out.println("k:2"); System.out.println("2"); } { i1=9; System.out.println("s"); // s="sss";//錯誤,因為沒有s這個變數。 } private int i1=6; // { // i1=9; // System.out.println("s"); // } public void printf(){ System.out.println(this.i1); } public static void main(String[] args) { // TODO Auto-generated method stub text t=new text(2); t.printf(); text t1=new text(2); t1.printf(); } } </span>
我們以這段程式碼來看,程式碼的執行結果如下
8
s
k:2
2
6
s
k:2
2
6
我們開啟除錯模式,一步步來看可以得出,當在第一次使用這個類來建立物件的時候,java還沒有載入這個類,所以在一開始他是先載入這個類去執行這個類的初始化塊,這個類的函式,建立類的物件,然後我們再根據這個類來建立物件。所以在一開始的時候。載入類-->建立類變數-->執行初始化程式碼塊。
隨後到了真正的建立物件。只要是建立物件,都是通過構造器來建立的。所以new 類()的時候,偵錯程式跳到的第一句是對應的構造器,但是這個時候他只是在說我找到這個構造器了,並沒有執行。隨後java做了裡面所有成員變數空間的建立,但是這個時候還沒有賦值,執行的時候預設初始化,就是都是0。
隨後開始執行程式碼塊,這個時候我們說的初始化程式碼塊,不僅僅是那些被{}在一起的程式碼塊,前面的,對成員變數不通過構造器的賦值也是,所以我們可以認為他做了:
private int i;
{i=8;}的操作
所以這一部分是按照順序執行的,所以我們會看到,要是我們把我們註釋的那部分程式碼塊解開註釋,這個時候輸出的就是:
2
9
在然後,才會執行構造器的東西。
然後再下一次的建立物件,因為類已經在載入過了,所以類的初始化塊就不會再執行了