關於java的初始化順序
最近在研究java基礎,對於java初始化的順序一直沒有搞清楚,找了很多資料和文章也還是依然費解。於是決定,自己研究,終於在一個小風嗖嗖的晚上搞清楚了order of initialization,現在分享給大家!
第一步:find class:這個時候jvm會找尋.class檔案,.class像個產品的磨具一樣,是用來產生object產品的而不是.class本身。
第二步:create object class:往往很少有人注意到這點,這也是一個oject也同樣佔用記憶體資源可是和傳統意義上的object不一樣,他是一個類似於磨具的東西,可和object一樣佔用空間。在第二步的時候我們會看到static field的東西得到了初始化,所以說static 的東西是屬於類物件而不是屬於物件的。當.class第一次被匯入的時候,被static修飾過的東西也隨之allocate。所以我們能夠有Class2.classField/Class2.classMethod的寫法,這些東西是隻佔用一塊記憶體空間的和new instance 沒有任何關係。對於沒有被static修飾過的field就屬於instance field了,這個時候obj.classField/obj.classMethod的寫法就產生了,他們和new instance 由某種惟妙惟肖的關係。
第三步:Definition initializaiont:這個時候程式會做一些定義初始化的動作,比如class類裡面的field的初始化。
最後一步:Construction initialization:這個地球人都知道了,我就不說了。
下面是一個例子,看看是否和你的想象一樣。
class Cup
{
Cup(int marker)
{
System.out.println("Cup(" + marker + ")");
}
void f(int marker)
{
System.out.println("f(" + marker + ")");
}
}
class Cups
{
static Cup c1=new Cup(1);
Cup c3=new Cup(3);
static Cup c2= new Cup(2);
Cups()
{
System.out.println("Cups()");
}
Cup c4=new Cup(4);
}
public class ExplicitStatic
{
Cups c=new Cups();
{
System.out.println("Hello");
}
public static void main(String[] args)
{
System.out.println("Inside main()");
Cups.c1.f(99);
ExplicitStatic x=new ExplicitStatic();
}
static Cups x = new Cups();
}
大家可以手動執行一下這個程式,考慮一下結果是什麼,然後參照下面的答案對照一下,看看是否正確:
Cup(1)
Cup(2)
Cup(3)
Cup(4)
Cups()
Inside main()
f(99)
Cup(3)
Cup(4)
Cups()
Hello
因為Static是屬於類物件的所以,只初始化一次。也正是因為Static是屬於類物件的所以,先處理被Static修飾過的東西。
Plus:
class field:共用一塊記憶體
class method:共用一塊記憶體
instance field:隨著每個instance各有一塊記憶體
instance method:共用一塊記憶體(_! why?)
JVM為了節省空間,所以
instance1.instanceMethod();
instance2.instanceMethod();
編譯器會吧instance1和instance2作為instanceMethod()的一個隱藏的引數傳入方法內(當然我們是看不到了)。這個東東就是我們常常說的this。用這種方法來區分是哪一個instance來呼叫方法,哎Gosling就是聰明。
第一步:find class:這個時候jvm會找尋.class檔案,.class像個產品的磨具一樣,是用來產生object產品的而不是.class本身。
第二步:create object class:往往很少有人注意到這點,這也是一個oject也同樣佔用記憶體資源可是和傳統意義上的object不一樣,他是一個類似於磨具的東西,可和object一樣佔用空間。在第二步的時候我們會看到static field的東西得到了初始化,所以說static 的東西是屬於類物件而不是屬於物件的。當.class第一次被匯入的時候,被static修飾過的東西也隨之allocate。所以我們能夠有Class2.classField/Class2.classMethod的寫法,這些東西是隻佔用一塊記憶體空間的和new instance 沒有任何關係。對於沒有被static修飾過的field就屬於instance field了,這個時候obj.classField/obj.classMethod的寫法就產生了,他們和new instance 由某種惟妙惟肖的關係。
第三步:Definition initializaiont:這個時候程式會做一些定義初始化的動作,比如class類裡面的field的初始化。
最後一步:Construction initialization:這個地球人都知道了,我就不說了。
下面是一個例子,看看是否和你的想象一樣。
class Cup
{
Cup(int marker)
{
System.out.println("Cup(" + marker + ")");
}
void f(int marker)
{
System.out.println("f(" + marker + ")");
}
}
class Cups
{
static Cup c1=new Cup(1);
Cup c3=new Cup(3);
static Cup c2= new Cup(2);
Cups()
{
System.out.println("Cups()");
}
Cup c4=new Cup(4);
}
public class ExplicitStatic
{
Cups c=new Cups();
{
System.out.println("Hello");
}
public static void main(String[] args)
{
System.out.println("Inside main()");
Cups.c1.f(99);
ExplicitStatic x=new ExplicitStatic();
}
static Cups x = new Cups();
}
大家可以手動執行一下這個程式,考慮一下結果是什麼,然後參照下面的答案對照一下,看看是否正確:
Cup(1)
Cup(2)
Cup(3)
Cup(4)
Cups()
Inside main()
f(99)
Cup(3)
Cup(4)
Cups()
Hello
因為Static是屬於類物件的所以,只初始化一次。也正是因為Static是屬於類物件的所以,先處理被Static修飾過的東西。
Plus:
class field:共用一塊記憶體
class method:共用一塊記憶體
instance field:隨著每個instance各有一塊記憶體
instance method:共用一塊記憶體(_! why?)
JVM為了節省空間,所以
instance1.instanceMethod();
instance2.instanceMethod();
編譯器會吧instance1和instance2作為instanceMethod()的一個隱藏的引數傳入方法內(當然我們是看不到了)。這個東東就是我們常常說的this。用這種方法來區分是哪一個instance來呼叫方法,哎Gosling就是聰明。
相關文章
- java類初始化的順序Java
- Java中class的初始化順序Java
- 關於JAVA中順序IO的基本操作Java
- 九、 Java程式初始化的順序(二)Java
- 關於RocketMQ的順序訊息MQ
- 關於 Promise 的執行順序Promise
- Java初始化靜態變數的時間順序Java變數
- 淺談Java類中的變數初始化順序Java變數
- Java子類和父類的初始化執行順序Java
- 程式碼說事 之 建立java物件的初始化順序Java物件
- # 關於select關鍵字語句定義順序# 關於select關鍵字語句執行順序
- 關於describe和test執行順序的翻譯
- 關於 SAP Spartacus Angular HTTP Interceptor 的攔截順序AngularHTTP
- java繼承關係下執行順序Java繼承
- 類的成員變數的初始化順序變數
- Java static變數、作用域、建構函式初始化順序Java變數函式
- 關於 i=i++ 問題、入棧順序
- 資料結構_順序表_順序表的初始化、插入、刪除、修改、查詢列印(基於C語言實現)資料結構C語言
- Java實現順序表Java
- SuperObject Delphi 的 JSON 屬性亂序 – 操作類改造 – 關於屬性順序的問題ObjectJSON
- Mysql關於my.cnf引數檔案的讀取順序及各項配置的覆蓋優先順序MySql
- 總結類初始化時的程式碼執行順序
- 學Java,Java書籍的最佳閱讀順序Java
- mysql 中sql語句關鍵字的書寫順序與執行順序MySql
- Java父子類載入順序Java
- java運算子優先順序Java
- JVM類載入機制與類初始化順序JVM
- java基礎(四) java運算順序的深入解析Java
- Java之執行緒的優先順序Java執行緒
- 關於java匿名內部類初始化法Java
- Java框架學習順序是哪些Java框架
- Java框架學習順序是哪些?Java框架
- java setPriority()設定優先順序Java
- Java for迴圈中語句執行的順序Java
- static程式碼塊、構造程式碼塊、建構函式以及Java類初始化順序C程式函式Java
- 關於MQ的幾件小事(五)如何保證訊息按順序執行MQ
- Java流程控制02:順序結構Java
- python運算子及優先順序順序Python
- 順序表