溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java中怎么實(shí)現(xiàn)類的初始化順序

發(fā)布時(shí)間:2021-06-16 14:18:40 來源:億速云 閱讀:139 作者:Leah 欄目:編程語言

本篇文章為大家展示了Java中怎么實(shí)現(xiàn)類的初始化順序,內(nèi)容簡明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

初始化順序圖示:

Java中怎么實(shí)現(xiàn)類的初始化順序

Java中怎么實(shí)現(xiàn)類的初始化順序

我們也可以通過下面的測試代碼來驗(yàn)證這一點(diǎn):

package com.trs.oop;
 
/**
 * 類的初始化順序
 * 靜態(tài)變量->靜態(tài)初始化塊->變量->初始化塊->構(gòu)造器
 * @author xiayunan
 * @date 2018年7月5日
 *
 */
public class InitialOrderTest { 
 
 // 靜態(tài)變量 
 
 public static String staticField = "靜態(tài)變量";
 
 // 變量 
 public String field = "變量"; 
 
 // 靜態(tài)初始化塊 
 static { 
  System.out.println(staticField); 
  System.out.println("靜態(tài)初始化塊"); 
 } 
 
 // 初始化塊 
 { 
  System.out.println(field); 
  System.out.println("初始化塊"); 
 } 
 
 // 構(gòu)造器 
 public InitialOrderTest() { 
  System.out.println("構(gòu)造器"); 
 } 
 
 public static void main(String[] args) {
  new InitialOrderTest(); 
 } 
}

運(yùn)行結(jié)果:

Java中怎么實(shí)現(xiàn)類的初始化順序

而對(duì)于繼承的情況初始化順序又會(huì)是怎么樣的呢?請(qǐng)看下面示例代碼:

package com.trs.oop;
 
/**
 * 有繼承關(guān)系的類初始化順序
 * @author xiayunan
 * @date 2018年7月5日
 *
 */
class Parent { 
 // 靜態(tài)變量 
 public static String p_StaticField = "父類--靜態(tài)變量";
 protected int i = 1;
 protected int j = 8;
 // 變量 
 public String p_Field = "父類--變量"; 
 
 // 靜態(tài)初始化塊 
 static { 
  System.out.println(p_StaticField); 
  System.out.println("父類--靜態(tài)初始化塊"); 
 } 
 
 // 初始化塊 
 { 
  System.out.println(p_Field); 
  System.out.println("父類--初始化塊"); 
 } 
 
 // 構(gòu)造器 
 public Parent() { 
  System.out.println("父類--構(gòu)造器"); 
  System.out.println("i=" + i + ", j=" + j);
  j = 9;
 } 
} 
 
public class SubClass extends Parent {
 
 // 靜態(tài)變量 
 public static String s_StaticField = "子類--靜態(tài)變量";
 
 // 變量 
 public String s_Field = "子類--變量"; 
 
 // 靜態(tài)初始化塊 
 static { 
  System.out.println(s_StaticField); 
  System.out.println("子類--靜態(tài)初始化塊"); 
 } 
 // 初始化塊 
 { 
  System.out.println(s_Field); 
  System.out.println("子類--初始化塊"); 
 } 
 
 // 構(gòu)造器 
 public SubClass() { 
  System.out.println("子類--構(gòu)造器"); 
  System.out.println("i=" + i + ",j=" + j);
 } 
 
 // 程序入口 
 public static void main(String[] args) {
  new SubClass(); 
 } 
}

運(yùn)行結(jié)果:

Java中怎么實(shí)現(xiàn)類的初始化順序

現(xiàn)在,結(jié)果已經(jīng)不言自明了。子類的靜態(tài)變量和靜態(tài)初始化塊的初始化是在父類的變量、初始化塊和構(gòu)造器初始化之前就完成了。

靜態(tài)變量、靜態(tài)初始化塊,變量、初始化塊初始化了順序取決于它們?cè)陬愔谐霈F(xiàn)的先后順序。

執(zhí)行過程分析

(1)訪問SubClass.main(),(這是一個(gè)static方法),于是裝載器就會(huì)為你尋找已經(jīng)編譯的SubClass類的代碼(也就是SubClass.class文件)。在裝載的過程中,裝載器注意到它有一個(gè)基類(也就是extends所要表示的意思),于是它再裝載基類。不管你創(chuàng)不創(chuàng)建基類對(duì)象,這個(gè)過程總會(huì)發(fā)生。如果基類還有基類,那么第二個(gè)基類也會(huì)被裝載,依此類推。

(2)執(zhí)行根基類的static初始化,然后是下一個(gè)派生類的static初始化,依此類推。這個(gè)順序非常重要,因?yàn)榕缮惖摹皊tatic初始化”有可能要依賴基類成員的正確初始化。

(3)當(dāng)所有必要的類都已經(jīng)裝載結(jié)束,開始執(zhí)行main()方法體,并用new SubClass()創(chuàng)建對(duì)象。

(4)類SubClass存在父類,則調(diào)用父類的構(gòu)造函數(shù),你可以使用super來指定調(diào)用哪個(gè)構(gòu)造函數(shù)(也就是Beetle()構(gòu)造函數(shù)所做的第一件事)。

基類的構(gòu)造過程以及構(gòu)造順序,同派生類的相同。首先基類中各個(gè)變量按照字面順序進(jìn)行初始化,然后執(zhí)行基類的構(gòu)造函數(shù)的其余部分。

(5)對(duì)子類成員數(shù)據(jù)按照它們聲明的順序初始化,執(zhí)行子類構(gòu)造函數(shù)的其余部分。

上述內(nèi)容就是Java中怎么實(shí)現(xiàn)類的初始化順序,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI