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

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Java類和對象的初始化順序

本文摘錄于http://blog.csdn.net/socoolfj/archive/2006/05/23/750425.aspx,并修改例子的代碼,加上自己的見解。

站在用戶的角度思考問題,與客戶深入溝通,找到濱江網(wǎng)站設(shè)計與濱江網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:網(wǎng)站設(shè)計制作、成都網(wǎng)站設(shè)計、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、申請域名、網(wǎng)絡(luò)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋濱江地區(qū)。

類裝載步驟

在Java中,類裝載器把一個類裝入Java虛擬機中,要經(jīng)過三個步驟來完成:裝載、鏈接和初始化,其中鏈接又可以分成校驗、準備和解析三步,除了解析外,其它步驟是嚴格按照順序完成的,各個步驟的主要工作如下:

裝載:查找和導(dǎo)入類或接口的二進制數(shù)據(jù);

鏈接:執(zhí)行下面的校驗、準備和解析步驟,其中解析步驟是可以選擇的;

校驗:檢查導(dǎo)入類或接口的二進制數(shù)據(jù)的正確性;

準備:給類的靜態(tài)變量分配并初始化存儲空間;

解析:將符號引用轉(zhuǎn)成直接引用;

初始化:激活類的靜態(tài)變量的初始化Java代碼和靜態(tài)Java代碼塊。

其中 初始化(initialization)包含兩部分:

1.類的初始化(initialization class & interface)

2.對象的創(chuàng)建(creation of new class instances)。

因為類的初始化其實是類加載(loading of classes)的***一步,所以很多書中把它歸結(jié)為“對象的創(chuàng)建”的***步。其實只是看問題的角度不同而已。為了更清楚的理解,這里還是分開來。

順序:

因為類的加載肯定是***步的,所以類的初始化在前。大體的初始化順序是:

類初始化 -> 子類構(gòu)造函數(shù) -> 父類構(gòu)造函數(shù) -> 實例化成員變量 -> 繼續(xù)執(zhí)行子類構(gòu)造函數(shù)的語句

下面結(jié)合例子,具體解釋一下。

1. 類的初始化(Initialization classes and interfaces)

其實很簡單,具體來說有:

(a)初始化類(initialization of class),是指初始化static field 和執(zhí)行static初始化塊。

 
 
 
  1. public class Demo{ 
  2.     //初始化static field,  
  3.     //其中= "initialization static field"又叫做static field initializer 
  4.     private static String str = "initialization static field"; 
  5.  
  6.     //初始化塊,又叫做static initializer,或 static initialization block 
  7.     static { 
  8.         System.out.println("This is static initializer"); 
  9.     } 

btw,有些書上提到static initializer 和 static field initializer 的概念,與之對應(yīng)的還有 instance initializer 和 instance variable initializer。例子中的注釋已經(jīng)解釋了其含義。

(b)初始化接口(initialization of interface),是指初始化定義在該interface中的field。

*注意*

1. initialization classes 時,該class的superclass 將首先被初始化,但其實現(xiàn)的interface則不會。

initialization classes 時,該class的superclass,以及superlcass的superclass 會首先被遞歸地初始化,一直到j(luò)ava.lang.Object為止。但initialiazation interface的時候,卻不需如此,只會初始化該interface本身。

2. 對于由引用類變量(class field)所引發(fā)的初始化,只會初始化真正定義該field的class。

3. 如果一個static field是編譯時常量(compile-time constant),則對它的引用不會引起定義它的類的初始化。

為了幫助理解***兩點,請試試看下面的例子:

Initialization類

 
 
 
  1. public class Initialization { 
  2.  
  3.     static { 
  4.         System.out.println("Initialization Main class"); 
  5.     } 
  6.  
  7.     public static void main(String[] args)  { 
  8.         System.out.println(Sub.y); 
  9.         System.out.println(Sub.x); 
  10.         System.out.println(Sub.z); 
  11.     } 

Sub類

 
 
 
  1. public class Sub extends Super { 
  2.     public static final int y = 2005; 
  3.     public static int z; 
  4.      
  5.     static { 
  6.         System.out.println("Initialization Sub"); 
  7.     } 

Super類

 
 
 
  1. public class Super { 
  2.     public static int x = 2006; 
  3.      
  4.     static { 
  5.         System.out.println("Initialization Super"); 
  6.     } 

輸入結(jié)果

Initialization Main class 
2005 
Initialization Super 
2006 
Initialization Sub 
0

從這個結(jié)果可以看到,

  1. static塊在類中會先執(zhí)行;(實際上是先加載static成員變量,然后是static代碼塊)
  2. static 的final變量不會引起類的初始化;
  3. 子類Sub引用父類Super里面的變量,就會引起父類的初始化,但不會引起子類的初始化;
  4. static的成員變量也有默認值。

2. 對象的創(chuàng)建(creation of new class instances)

看例子來說明:

InitializationOrder類

 
 
 
  1. public class InitializationOrder { 
  2.     public static void main(String[] args) { 
  3.         SubClass sb = new SubClass(); 
  4.     } 

SuperClass類

 
 
 
  1. public class SuperClass{ 
  2.     static { 
  3.         System.out.println("SuperClass static"); 
  4.     } 
  5.  
  6.     SuperClass(String str){ 
  7.         System.out.println(str); 
  8.     } 

Interface類

 
 
 
  1. interface Interface{ 
  2.     static SuperClass su = new SuperClass("Interface new SuperClass"); 

SubClass類

 
 
 
  1. public class SubClass extends SuperClass implements Interface{ 
  2.  
  3.     static { 
  4.         System.out.println("SubClass static"); 
  5.     } 
  6.  
  7.     private SuperClass su = new SuperClass("initialization variable"); 
  8.  
  9.     SubClass() { 
  10.         super("super"); 
  11.         new SuperClass("new SuperClass"); 
  12.     } 

輸出結(jié)果

SuperClass static 
SubClass static 
super 
initialization variable 
new SuperClass

解釋一下:

1) Java虛擬機要執(zhí)行InitializationOrder類中的static 方法main(),這引起了類的初始化。開始初始化InitializationOrder類。具體的步驟略去不說。

2) InitializationOrder類初始化完畢后,開始執(zhí)行main()方法。語句SubClass sb = new SubClass()將創(chuàng)建一個SubClass對象。加載類SubClass后對其進行類初始化,因為Subclass有一個父類SuperClass,所以先初始化SuperClass類。于是看到輸出“SuperClass static”。

3) SuperClass類初始化完畢后,開始初始化SubClass類,輸出“SubClass static”。

4) 至此,類的加載工作全部完成。開始進入創(chuàng)建SubClass的對象過程。先為SubClass類和其父類SuperClass類分配內(nèi)存空間,這時Super su 被賦值為null。

5) 執(zhí)行構(gòu)造函數(shù)SubClass(),執(zhí)行super(), 調(diào)用父類的構(gòu)造函數(shù),輸出“super”。

6) 初始化SubClass類的成員變量su,輸出“initialization variable”。

7) 繼續(xù)執(zhí)行構(gòu)造函數(shù)的剩余部分,執(zhí)行new SuperClass("new SuperClass"),輸出“new SuperClass”,這時Super su 被賦值新建對象的引用。

8) 而SubClass雖然實現(xiàn)了接口Interface,但是初始化它的時候并不會引起接口的初始化,所以接口Interface中的static SuperClass su = new SuperClass("Interface new SuperClass")自始至終都沒有被執(zhí)行到。

所以對象的創(chuàng)建,具體步驟如下:

(1) 所有的成員變量—包括該類,及它的父類中的成員變量--被分配內(nèi)存空間,并賦予默認值。(這里是***次初始化成員變量)

(2) 為所調(diào)用的構(gòu)造函數(shù)初始化其參數(shù)變量。(如果有參數(shù))

(3) 如果在構(gòu)造函數(shù)中用this 調(diào)用了同類中的其他構(gòu)造函數(shù),則按照步驟(2)~(6)去處理被調(diào)用到的構(gòu)造函數(shù)。

(4) 如果在構(gòu)造函數(shù)中用super調(diào)用了其父類的構(gòu)造函數(shù),則按照步驟(2)~(6)去處理被調(diào)用到的父類構(gòu)造函數(shù)。

(5) 按照書寫順序,執(zhí)行instance initializer 和 instance variable initializer來初始化成員變量。(這里是第二次初始化成員變量)

(6) 按照書寫順序,執(zhí)行構(gòu)造函數(shù)的其余部分。

*******************

總結(jié):

從類的初始化和對象的創(chuàng)建步驟,可以知道,一個類是先初始化static的變量和static句塊,然后在分配該類以及父類的成員變量的內(nèi)存空間,賦予默認值,然后開始調(diào)用構(gòu)造函數(shù)。而子類和父類之間,則先初始化和創(chuàng)建父類,然后在初始化和創(chuàng)建子類的。


文章題目:Java類和對象的初始化順序
文章位置:http://www.5511xx.com/article/cohhdic.html