java物件的建立過程

2021-06-18 14:30:10 字數 2852 閱讀 1112

以一道例題開始:
public class test 

static

public test(string str)

public static int print(string str)

public static void main(string args)

}

執行結果是:

1:j i=0 n=0

2:構造快 i=1 n=1

3:t1 i=2 n=2

4:j i=3 n=3

5:構造快 i=4 n=4

6:t2 i=5 n=5

7:i i=6 n=6

8:靜態塊 i=7 n=99

9:j i=8 n=100

10:構造快 i=9 n=101

11:init i=10 n=102

對上題執行結果的分析:

載入類資訊:

1、靜態變數預設初始化

2、對靜態變數賦值 (賦值順序按書寫順序)

3、靜態**塊中內容

建立物件:

1、例項變數初始化

2、例項變數賦值(依然按順序)

3、構造**塊中內容

4、建構函式中內容

public static int k = 0; //對靜態變數k初始化

public static test t1 = new test("t1"); //t1預設值null,下面就是賦值

public test(string str) //建立t1物件,但現在並不是執行建構函式內的**

public int j = print("j"); //對例項變數賦值,當然賦值前會進行預設初始化,即為0

public static int print(string str) //j變數的輸出 執行print**段 輸出

1:j i=0 n=0 //此時i和j還沒有載入,值仍是預設的值

print("構造快"); //例項變數初始化後,執行構造**塊中內容,對於構造**塊中的內容,每建立一次物件,都會執行一次

public static int print(string str) //構造**塊的輸出 執行print

2:構造塊 i=1 n=1

public test(string str) //執行建構函式中**段,輸出

3:t1 i=2 n=2

public static test t2 = new test("t2"); //其執行順序和t1的初始化一樣 下面只寫輸出內容

4:j i=3 n=3

5:構造塊 i=4 n=4

6:t2 i=5 n=5

public static int i = print("i"); //繼續按順序對靜態變數賦值

public static int print(string str) //輸出

7:i i=6 n=6

public static int n = 99;

print("靜態塊"); //對靜態變數賦值完後 執行靜態**塊

8:靜態塊 i=7 n=99 //此時已經對n進行了賦值,所以其值為99

new test("init") //靜態資訊載入完畢後 就是物件的建立

public int j = print("j"); //每個物件建立後都會對例項變數 預設初始化 賦值 然後執行構造**塊 建構函式

9:j i=8 n=100

print("構造快");

10:構造塊 i=9 n=101

public test(string str)//建構函式

11:init i=10 n=102

以上只是針對該題的分析,下面總結一下

物件建立時物件的載入過程:

1、類資訊載入

載入父類資訊(靜態屬性預設初始化 -> 靜態屬性賦值 ->靜態**塊) -> 載入子類資訊(順序同父)

注:類的資訊只載入一次,之後建立物件時,類資訊不在重複載入

2、物件建立

父類物件資訊(父類例項屬性預設初始化 -> 賦值 ->構造**塊->建構函式) -> 子類物件建立(順序同父類)

注:在子類的建構函式第一行**,當沒有 super 或 this 的明確呼叫時,預設 super()

即呼叫父類無參建構函式

當父類中有建構函式,但是沒有無參構造時(當然此時沒有預設的無參構造),子類必須有建構函式,

且要明確呼叫的建構函式,即 super(引數) 或 this (引數) 明確指定。這也就是說此時子類的引數個數

也有一定的限制,即引數個數不能多於 super 或 this中的引數個數。所以建立類時,為了更好的擴充套件

一般都要寫上無參建構函式。

對上面的描述,幾個例子簡單分析一下

public class test extends father

static

public test(string str)

public static void main(string args)

}class father

static

father()

father(string name)

}

執行結果:

父類靜態**塊30 //父類靜態屬性 -> 父類靜態**塊

子類靜態**塊10 //子類靜態資訊 -> 子類靜態**塊

父類構造**塊30null //父類例項變數(預設初值為null) 父類構造**塊

父類無參構造30null //子烈預設呼叫父類的無參構造

子類構造**塊20 10 //子類

子類建構函式20 10

java建立物件的過程

工作中每天都在建立物件 new 物件 可是在jvm中具體是怎麼實現的,對於這樣的問題,在面試的時候,會經常被問到,對於一位專業的開發怎麼能不知道呢?有種想哭的衝動,竟然答不上來。看來還要繼續加強學習,不管是簡單的基礎,還是流行的技術,都要時時學,時時複習,不多說,上面試精髓。作為一名開發,都知道用n...

物件的建立過程

jvm查詢類的路徑,定位到.class檔案 載入.class檔案,有關靜態初始化的所有動作都會被執行 靜態初始化只在物件首次載入的時候進行一次 當用new建立物件的時候,在堆上為物件分配足夠的空間 儲存空間將會被初始化,自動為物件的所有基本資料型別設定成預設值,引用被置為null 執行所有出現於字段...

物件的建立過程

直接上 public class sup public sup static package com.test.resources public class sub extends sup public sub static public class test 父類靜態 塊 在父類的無參構造上面 父...