Java中物件的初始化過程詳解
阿新 • • 發佈:2018-11-05
在Java中,我們需要對物件進行初始化操作。
經常需要new 物件。但是new物件時到底發生了什麼呢?
有時候我們不是特別清晰。
所以今天又重新學習了一下JavaSE部分,又有了新的感受。
在此記錄一下
首先程式碼部分
Person類:
class Person{
private String name;
private int age;
private static String country = "cn";
Person(String name,int age){
this.name = name;
this .age = age;
}
//構造程式碼塊
{
System.out.println(name+".."+age);
}
//靜態程式碼塊
static{
System.out.println("靜態程式碼塊");
}
public void setName(String name){
this.name = name;
}
public void speak(){
System.out.println(this.name+"..."
+this .age);
}
public static void showCountry(){
System.out.println("country="+country);
}
}
PersonDemo類(測試類)
class PersonDemo{
public static void main(String[] args) {
Person p = new Person("zhangsan",20);
}
}
在Person p = new Person(“zhangsan”,20);
在執行這句這行程式碼時做了什麼呢?
首先棧記憶體中有個引用(p)
右邊有 值(new Person())所以需要載入Person類,
當Person p = null;是不會載入Person類的
1. new 物件的的時候。JVM從硬碟中取Person.class檔案並載入到記憶體中。
2. 執行該類中的static程式碼塊(靜態程式碼塊),如果有的話,給Person.class類進行初始化
3. 並開闢了堆記憶體空間。分配記憶體地址
4. 在對記憶體中建立物件的特有屬性,並進行預設初始化(比如int型別預設為0,引用型別預設為null等)。
5. 對屬性進行顯示初始化,
6. 對物件進行構造程式碼塊初始化
7. 對物件進行對應的建構函式初始化
8. 將記憶體地址賦值給棧記憶體中的p變數