日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

JAVA程序執(zhí)行順序,你了解了嗎?

 520jefferson 2013-09-27


     一。JAVA中執(zhí)行順序

  1. 靜態(tài)塊
  2. 構(gòu)造器
  3. 父類(lèi)構(gòu)造器

    二。JAVA中賦值順序

  1.       靜態(tài)塊直接賦值
  2.       塊直接賦值
  3.       父類(lèi)繼承的屬性已賦值
  4.       靜態(tài)變量聲明時(shí)賦值
  5.       成員變量聲明時(shí)賦值
  6.       構(gòu)造器賦值

 

 第一部分很好測(cè)試,我們只需要寫(xiě)一個(gè)子類(lèi),類(lèi)中定義一個(gè)靜態(tài)塊,一個(gè)普通塊,一個(gè)構(gòu)造器,它的父類(lèi)構(gòu)造器,都打印一條語(yǔ)句,即可明白它們直接的執(zhí)行順序

 

Mastiff類(lèi)

 

Java代碼  收藏代碼
  1. <span style="font-size: medium;">/** 
  2.  * 子類(lèi)藏獒 
  3.  */  
  4. public class Mastiff extends Dog {  
  5.     public Mastiff() {  
  6.         System.out.println("Mastiff");  
  7.     }  
  8.   
  9.     {  
  10.         System.out.println("block");  
  11.     }  
  12.     static {  
  13.         System.out.println("static block");  
  14.     }  
  15.       
  16.     public static void  main(String[] args){  
  17.         Mastiff mastiff=new Mastiff();  
  18.           
  19.     }  
  20. }  
  21. </span>  

 

 

  DOG類(lèi)

 

Java代碼  收藏代碼
  1. <span style="font-size: medium;">/** 
  2.  *DOG父類(lèi) 
  3.  */  
  4. public class Dog {  
  5.     public Dog() {  
  6.         System.out.println("Dog");  
  7.     }  
  8. }  
  9. </span>  

 

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

static block
Dog
block
Mastiff

 

也就是說(shuō),在我們的程序中,實(shí)例化一個(gè)類(lèi)對(duì)象的時(shí)候,運(yùn)行順序?yàn)椋?/span>

  1.   靜態(tài)塊
  2.   父類(lèi)構(gòu)造器
  3.   本類(lèi)中的塊
  4.   本類(lèi)的構(gòu)造器 

我們可以更進(jìn)一步,如果在父類(lèi)中也有塊和靜態(tài)塊呢?

    DOG類(lèi)改進(jìn)后源碼 

Java代碼  收藏代碼
  1. <span style="font-size: medium;">/** 
  2.  *DOG父類(lèi) 
  3.  */  
  4. public class Dog {  
  5.     public Dog() {  
  6.         System.out.println("Dog");  
  7.     }  
  8.     static{  
  9.         System.out.println("super static block");  
  10.     }  
  11.       
  12.     {  
  13.         System.out.println("super block");  
  14.     }  
  15. }  
  16. </span>  

  

   Mastiff改進(jìn)后源碼

Java代碼  收藏代碼
  1. <span style="font-size: medium;">/** 
  2.  * 子類(lèi)藏獒 
  3.  */  
  4. public class Mastiff extends Dog {  
  5.     public Mastiff() {  
  6.         System.out.println("Mastiff");  
  7.     }  
  8.   
  9.     {  
  10.         System.out.println("block");  
  11.           
  12.     }  
  13.     static {  
  14.         System.out.println("static block");  
  15.     }  
  16.       
  17.     public static void  main(String[] args){  
  18.         Mastiff mastiff=new Mastiff();        
  19.     }  
  20. }  
  21. </span>  

 

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

super static block
static block
super block
Dog
block
Mastiff

 也就是說(shuō)此時(shí)的運(yùn)行順序?yàn)椋?/span>

  1.    父類(lèi)靜態(tài)塊
  2.    自身靜態(tài)塊
  3.    父類(lèi)塊
  4.    父類(lèi)構(gòu)造器
  5.    自身塊
  6.    自身構(gòu)造器 

 

  好了,知道了運(yùn)行的順序,那么這是為什么呢?

         這就要從JVM中類(lèi)的裝載機(jī)制和實(shí)例化機(jī)制開(kāi)始說(shuō)起,這里因?yàn)橹黝}原因,先不討論,有興趣的同學(xué)可以自己查資料。

 

我們?cè)賮?lái)討論第二個(gè)問(wèn)題,一個(gè)變量的值,它有可能在哪些地方確定呢??

  1. 從父類(lèi)繼承該值(包括:1.作為父類(lèi)的成員變量已經(jīng)賦值  2.在父類(lèi)的塊中賦值  3.在父類(lèi)的構(gòu)造器中賦值)
  2. 在構(gòu)造器中對(duì)其進(jìn)行賦值
  3. 在塊中進(jìn)行賦值
  4. 在方法調(diào)用中進(jìn)行賦值

  現(xiàn)在假設(shè)在我們剛剛的例子中,有一個(gè)變量type,表示狗的品種

 

Java代碼  收藏代碼
  1. <span style="font-size: medium;">/** 
  2.  *DOG父類(lèi) 
  3.  */  
  4. public class Dog {  
  5.     public String type="父類(lèi)成員變量賦的值";  
  6.     public Dog() {  
  7.         System.out.println("父類(lèi)構(gòu)造器--type-->"+type);  
  8.         type="父類(lèi)構(gòu)造器賦的值";  
  9.                    System.out.println("父類(lèi)構(gòu)造器----type--->"+type);  
  10.     }  
  11.       
  12.     {  
  13.         System.out.println("block---type--->"+type);  
  14.         type="父類(lèi)塊賦的值";  
  15.     }  
  16. }  
  17. </span>  

 

   

Java代碼  收藏代碼
  1. <span style="font-size: medium;">/** 
  2.  * 子類(lèi)藏獒 
  3.  */  
  4. public class Mastiff extends Dog {  
  5.     public String type="成員變量賦的值";  
  6.     public Mastiff() {  
  7.         System.out.println("構(gòu)造器---type--->"+type);  
  8.         type="構(gòu)造器賦的值";  
  9.     }  
  10.       
  11.     public void say(){  
  12.         System.out.println("say---type---->"+type);  
  13.     }  
  14.   
  15.     {  
  16.         System.out.println("block---type--->"+type);  
  17.         type="塊賦的值";  
  18.           
  19.     }  
  20.       
  21.     public static void  main(String[] args){  
  22.         Mastiff mastiff=new Mastiff();  
  23.         mastiff.say()</span><span style="font-size: medium;">;</span><span style="font-size: medium;">        
  24.     }  
  25. }  
  26. </span>  

   

 

 執(zhí)行結(jié)果如下:

block---type--->父類(lèi)成員變量賦的值
父類(lèi)構(gòu)造器--type-->父類(lèi)塊賦的值
父類(lèi)構(gòu)造器----type--->父類(lèi)構(gòu)造器賦的值
block---type--->成員變量賦的值
構(gòu)造器---type--->塊賦的值
say---type---->構(gòu)造器賦的值

 

答案很明顯,賦值順序?yàn)椋?/span>

  1. 父類(lèi)成員變量賦值
  2. 父類(lèi)塊賦值
  3. 父類(lèi)構(gòu)造器賦值
  4. 自身成員變量賦值
  5. 自身塊賦值
  6. 自身構(gòu)造器賦值

 

     

     結(jié)合我們前面說(shuō)的程序中的執(zhí)行順序,這個(gè)顯然是很好理解的:

       1.成員變量賦值>>>塊賦值>>>構(gòu)造器賦值

       2.父類(lèi)的塊>>父類(lèi)構(gòu)造器>>自身塊>>自身構(gòu)造器


     又因?yàn)橐粋€(gè)成員變量是不可能在靜態(tài)變量中賦值的,而且又前面程序執(zhí)行順序可知

        靜態(tài)塊>>塊

     

     

    所以,程序的賦值步驟為

    1. 父類(lèi)的靜態(tài)變量賦值
    2. 自身的靜態(tài)變量賦值
    3. 父類(lèi)成員變量賦值
    4. 父類(lèi)塊賦值
    5. 父類(lèi)構(gòu)造器賦值
    6. 自身成員變量賦值
    7. 自身塊賦值
    8. 自身構(gòu)造器賦值

       

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶(hù) 評(píng)論公約

        類(lèi)似文章 更多