日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯網營銷解決方案
Java 對象初始化具體步驟

在Java中,一個對象在可以被使用之前必須要被正確地初始化,這一點是Java規(guī)范規(guī)定的。在實例化一個對象時,JVM首先會檢查相關類型是否已經加載并初始化,如果沒有,則JVM立即進行加載并調用類構造器完成類的初始化。在類初始化過程中或初始化完畢后,根據具體情況才會去對類進行實例化。本文試圖對JVM執(zhí)行類初始化和實例化的過程做一個詳細深入地介紹,以便從Java虛擬機的角度清晰解剖一個Java對象的創(chuàng)建過程。

公司主營業(yè)務:成都做網站、成都網站制作、移動網站開發(fā)等業(yè)務。幫助企業(yè)客戶真正實現互聯網宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯公司是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯公司推出肅北免費做網站回饋大家。

一個類及其對象初始化的過程

什么時候需要初始化一個類

首次創(chuàng)建某個對象時:

Dog dog = new Dog();

首次訪問某個類的靜態(tài)方法或者靜態(tài)字段時:

Dog.staticFields;

Java 解釋器就會去找類的路徑,定位已經編譯好的 Dog.class 文件。

獲得類的資源

然后 jvm 就會載入 Dog.class,生成一個 class 對象。這個時候如果有靜態(tài)的方法或者變量,靜態(tài)初始化動作都會被執(zhí)行。這個時候要注意啦,靜態(tài)初始化在程序運行過程中只會在 Class 對象首次加載的時候運行一次。這些資源都會放在 jvm 的方法區(qū)。

方法區(qū)又叫靜態(tài)區(qū),跟堆一樣,被所有的線程共享。

方法區(qū)中包含的都是在整個程序中永遠唯一的元素,包含所有的 class 和 static 變量。

初始化對象 *Dog dog = new Dog()*

  1. 第一次創(chuàng)建 Dog 對象先執(zhí)行上面的一二步
  2. 在堆上為 Dog 對象分配足夠的存儲空間,所有屬性和方法都被設置成默認值(數字為 0,字符為 null,布爾為 false,而所有引用被設置成 null)
  3. 執(zhí)行構造函數檢查是否有父類,如果有父類會先調用父類的構造函數,這里假設 Dog 沒有父類,執(zhí)行默認值字段的賦值即方法的初始化動作。
  4. 執(zhí)行構造函數。

有父類情況下的初始化

假設: Dog extends Animal

1.執(zhí)行第一步,找出 Dog.class 文件,接著在加載過程中發(fā)現他有一個基類(通過 extends 關鍵字),于是先執(zhí)行 Animal 類的第一二步,加載其靜態(tài)變量和方法,加載結束之后再加載子類 Dog 的靜態(tài)變量和方法。 如果 Animal 類還有父類就以此類推,最終的基類叫做根基類。 注意:因為子類的 static 初始化可能會依賴于父類的靜態(tài)資源,所以要先加載父類的靜態(tài)資源。

2.接著要 new Dog 對象,先為 Dog 對象分配存儲空間 -> 到 Dog 的構造函數 -> 創(chuàng)建默認的屬性。這里其構造函數里面的第一行有個隱含的 super(),即父類構造函數,所以這時會跳轉到父類 Animal 的構造函數。

Java 會幫我們完成構造函數的補充,Dog 實際隱式的構造函數如下:

Dog() {
   //創(chuàng)建默認的屬性和方法
   //調用父類的構造函數super()(可顯式寫出)
   //對默認屬性和方法分別進行賦值和初始化
}

3、父類 Animal 執(zhí)行構造函數前也是分配存儲空間 -> 到其構造函數 -> 創(chuàng)建默認的屬性 -> 發(fā)現挖槽我已經沒有父類了,這個時候就給它的默認的屬性賦值和方法的初始化。

4、接著執(zhí)行構造函數余下的部分,結束后跳轉到子類 Dog 的構造函數。

5、子類 Dog 對默認屬性和方法分別進行賦值和初始化,接著完成構造函數接下來的部分。

一、為什么要執(zhí)行父類 Animal 的構造方法才繼續(xù)子類 Dog 的屬性及方法賦值?

因為子類 Dog 的非靜態(tài)變量和方法的初始化有可能使用到其父類 Animal 的屬性或方法,所以子類構造默認的屬性和方法之后不應該進行賦值,而要跳轉到父類的構造方法完成父類對象的構造之后,才來對自己的屬性和方法進行初始化。

這也是為什么子類的構造函數顯示調用父類構造函數 super() 時要強制寫在第一行的原因,程序需要跳轉到父類構造函數完成父類對象的構造后才能執(zhí)行子類構造函數的余下部分。

二、為什么對屬性和方法初始化之后再執(zhí)行構造函數其他的部分?

因為構造函數中的顯式部分有可能使用到對象的屬性和方法。

Tips:其實這種初始化過程都是為了保證后面資源初始化用到的東西前面的已經初始化完畢了。很厲害,膜拜 Java 的父親們。

說了這么多還是來個例子吧。

這里注意 main 函數也是一個靜態(tài)資源,執(zhí)行 Dog 類的 main 函數就是調用 Dog 的靜態(tài)資源。

實例

//父類Animal
class Animal {  
/*8、執(zhí)行初始化*/  
   private int i = 9;  
   protected int j;  

/*7、調用構造方法,創(chuàng)建默認屬性和方法,完成后發(fā)現自己沒有父類*/  
   public Animal() {  
/*9、執(zhí)行構造方法剩下的內容,結束后回到子類構造函數中*/  
       System.out.println("i = " + i + ", j = " + j);  
       j = 39;  
    }  

/*2、初始化根基類的靜態(tài)對象和靜態(tài)方法*/  
   private static int x1 = print("static Animal.x1 initialized");  
   static int print(String s) {  
       System.out.println(s);  
       return 47;  
   }  
}  

//子類 Dog
public class Dog extends Animal {  
/*10、初始化默認的屬性和方法*/
   private int k = print("Dog.k initialized");  

/*6、開始創(chuàng)建對象,即分配存儲空間->創(chuàng)建默認的屬性和方法。
    * 遇到隱式或者顯式寫出的super()跳轉到父類Animal的構造函數。
    * super()要寫在構造函數第一行 */  
   public Dog() {
/*11、初始化結束執(zhí)行剩下的語句*/
       System.out.println("k = " + k);  
       System.out.println("j = " + j);  
   }  

/*3、初始化子類的靜態(tài)對象靜態(tài)方法,當然mian函數也是靜態(tài)方法*/  
   private static int x2 = print("static Dog.x2 initialized");

/*1、要執(zhí)行靜態(tài)main,首先要加載Dog.class文件,加載過程中發(fā)現有父類Animal,
   *所以也要加載Animal.class文件,直至找到根基類,這里就是Animal*/      
   public static void main(String[] args) {  

/*4、前面步驟完成后執(zhí)行main方法,輸出語句*/
       System.out.println("Dog constructor");
/*5、遇到new Dog(),調用Dog對象的構造函數*/  
       Dog dog = new Dog();  
/*12、運行main函數余下的部分程序*/            
       System.out.println("Main Left");
   }  
}

測試輸出結果為:

static Animal.x1 initialized
static Dog.x2 initialized
Dog constructor
i = 9, j = 0
Dog.k initialized
k = 47
j = 39
Main Left

當前名稱:Java 對象初始化具體步驟
文章源于:http://m.5511xx.com/article/dhjsphj.html