以一道例題開始:
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 父類靜態 塊 在父類的無參構造上面 父...