成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java類和對(duì)象的初始化順序

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

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

類裝載步驟

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

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

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

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

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

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

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

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

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

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

因?yàn)轭惖某跏蓟鋵?shí)是類加載(loading of classes)的***一步,所以很多書中把它歸結(jié)為“對(duì)象的創(chuàng)建”的***步。其實(shí)只是看問題的角度不同而已。為了更清楚的理解,這里還是分開來。

順序:

因?yàn)轭惖募虞d肯定是***步的,所以類的初始化在前。大體的初始化順序是:

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

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

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

其實(shí)很簡(jiǎn)單,具體來說有:

(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.     }   
  10. }  

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

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

*注意*

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

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

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

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

為了幫助理解***兩點(diǎn),請(qǐng)?jiān)囋嚳聪旅娴睦樱?/p>

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.     }   
  12. }  

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.     }   
  8. }  

Super類

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

輸入結(jié)果

Initialization Main class 
2005 
Initialization Super 
2006 
Initialization Sub 
0

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

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

2. 對(duì)象的創(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.     }   
  5. }  

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.     }   
  9. }  

Interface類

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

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.     }   
  13. }  

輸出結(jié)果

SuperClass static 
SubClass static 
super 
initialization variable 
new SuperClass

解釋一下:

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

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

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

4) 至此,類的加載工作全部完成。開始進(jìn)入創(chuàng)建SubClass的對(duì)象過程。先為SubClass類和其父類SuperClass類分配內(nèi)存空間,這時(shí)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”,這時(shí)Super su 被賦值新建對(duì)象的引用。

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

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

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

(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é):

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

原文鏈接:http://android.blog.51cto.com/268543/384500

【編輯推薦】

  1. Think in Java之構(gòu)造器的真正調(diào)用順序
  2. 用Java編寫你自己的簡(jiǎn)單HTTP服務(wù)器
  3. 拯救Java程序猿的神器:Play Framework
  4. 有可能挑戰(zhàn)Java優(yōu)勢(shì)的四種技術(shù)
  5. Think in Java之斐波那契數(shù)列

 

責(zé)任編輯:林師授 來源: Icansoft的博客
相關(guān)推薦

2012-05-23 12:46:53

JavaJava類

2013-03-04 11:10:03

JavaJVM

2010-07-28 10:22:33

FlexApplica

2022-01-04 19:33:03

Java構(gòu)造器調(diào)用

2009-07-03 16:21:33

Java的聲明和初始化Java

2011-07-22 17:46:43

java

2011-06-17 15:29:44

C#對(duì)象初始化器集合初始化器

2012-04-09 13:43:12

Java

2011-03-23 15:02:55

ListenerFilterServlet

2009-12-16 14:04:04

Ruby對(duì)象初始化

2009-07-31 17:51:27

C#對(duì)象初始化

2024-03-12 07:44:53

JVM雙親委托機(jī)制類加載器

2020-11-02 07:02:10

加載鏈接初始化

2024-03-08 08:26:25

類的加載Class文件Java

2009-08-27 10:31:39

C#對(duì)象初始化器

2011-06-09 14:13:06

C++JAVA缺省初始化

2021-04-01 10:01:55

JavaStringJava基礎(chǔ)

2012-03-13 13:38:42

Java

2019-11-04 13:50:36

Java數(shù)組編程語言

2009-04-23 17:56:05

C#自動(dòng)屬性對(duì)象初始化
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 久久久蜜桃 | 日韩精品一区二区久久 | 国产成人精品久久二区二区 | 一级片在线观看 | 奇米四色影视 | 精品亚洲一区二区三区四区五区 | 韩国精品一区 | 特黄特色大片免费视频观看 | 欧美三区在线观看 | 国产99热| 日韩中文字幕一区 | 一区二区三区国产精品 | 亚洲欧美日韩在线不卡 | 中文字幕视频在线 | 日韩一级黄色毛片 | 久久综合九九 | 欧美区日韩区 | 9999久久 | 午夜影视在线观看 | 色吊丝2288sds中文字幕 | 精品亚洲国产成av人片传媒 | 欧美精品一区三区 | 国产一区亚洲 | 成人日批视频 | 久久久精品一区 | www,黄色,com| 欧美日韩成人网 | 天天干狠狠操 | 久久久久久久91 | 日本久久视频 | 激情 婷婷| 亚洲一区二区日韩 | 亚洲精品乱码久久久久久黑人 | 日韩精品一区二区三区在线观看 | 免费的av | 日本久久久一区二区三区 | 国产一区中文字幕 | 国产日韩欧美一区 | 亚洲美女一区 | 欧美一区两区 | 国产一区亚洲二区三区 |