• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            tbwshc

            tbw

              C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
              95 Posts :: 8 Stories :: 3 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(4)

            我參與的團隊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            java對象的初始化

            小冬(珠海)11:02:48
            我們知道一個對象可以有靜態變量、變量、靜態初始化塊、初始化塊,當我們創建一個對象時,它是怎么初始化的呢?按什么順序初始化的呢?
             
            1. public class Test { 
            2.  
            3.      
            4.     // 靜態變量 
            5.     public static String staticField = "靜態變量"; // 變量 
            6.     public String field = "變量"
            7.     // 靜態初始化塊 
            8.     static { 
            9.         System.out.println(staticField); 
            10.         System.out.println("靜態初始化塊"); 
            11.     } 
            12.     // 初始化塊 
            13.     { 
            14.         System.out.println(field); 
            15.         System.out.println("初始化塊"); 
            16.     } 
            17.     // 構造器 
            18.     public Test() { 
            19.         System.out.println("構造器"); 
            20.     } 
            21.     public static void main(String[] args) { 
            22.         Test test = new Testb(); 
            23.  
            24.     } 
             
            運行下代碼,輸出結果是:
            靜態變量
            靜態初始化塊
            變量
            初始化塊
            構造器
             
             
            由此可以看到,當new一個對象時,它并不是就是調構造方法,而是先初始化屬性變量,我們把變量的定義先后順序換下,再執行,會發現,靜態的是先于非靜態進行實始化的,那么對于靜態變量和靜態初始化塊之間、變量和初始化塊之間的先后順序又是怎樣呢?是否靜態變量總是先于靜態初始化塊,變量總是先于初始化塊就被初始化了呢?
            我們先改下代碼:
             
            1. public class Test { 
            2.  
            3.     public static TestA ta = new TestA(); 
            4.     // 靜態變量 
            5.     public static String staticField = "靜態變量"; // 變量 
            6.     public String field = "變量"
            7.     // 靜態初始化塊 
            8.     static { 
            9.         System.out.println(staticField); 
            10.         System.out.println("靜態初始化塊"); 
            11.     } 
            12.     // 初始化塊 
            13.     { 
            14.         System.out.println(field); 
            15.         System.out.println("初始化塊"); 
            16.     } 
            17.     // 構造器 
            18.     public Test() { 
            19.         System.out.println("構造器"); 
            20.     } 
            21.     public static void main(String[] args) { 
            22.         Test test = new Test(); 
            23.  
            24.     } 
            25.  
            26. class TestA { 
            27.     public TestA() { 
            28.         System.out.println("Test--A"); 
            29.     } 
             輸出是:
            Test--A
            靜態變量
            靜態初始化塊
            變量
            初始化塊
            構造器
             
             
            靜態變量:static TestA ta = new TestA()在靜態初始化塊前,所以先輸出Test--A
            再換下位置,把static TestA ta = new TestA()放到在靜態初始化塊后,我們發現輸出是:
            靜態變量
            靜態初始化塊
            Test--A
            變量
            初始化塊
            構造器
             
             
            由此可見這是取決于它們在類中出現的先后順序,同理可得:變量和初始化塊之間也如此,總結可得:初始化優先級是(靜態變量/靜態初始化塊)>(變量/初始化塊)>構造器。
             
             
            那繼承關系時的初始化又是怎樣的呢?如下:
            大家應該知道,初始化子類時會先初始化父類,再看代碼:
             
            1. public class Test extends Parent{ 
            2.     // 靜態變量 
            3.     public static String staticField = "子類靜態變量"; // 變量 
            4.     public String field = "子類變量"
            5.     // 靜態初始化塊 
            6.     static { 
            7.         System.out.println(staticField); 
            8.         System.out.println("子類靜態初始化塊"); 
            9.     } 
            10.     //public static TestA ta = new TestA(); 
            11.     // 初始化塊 
            12.     { 
            13.         System.out.println(field); 
            14.         System.out.println("子類初始化塊"); 
            15.     } 
            16.     // 構造器 
            17.     public Test() { 
            18.         System.out.println("子類構造器"); 
            19.     } 
            20.     public static void main(String[] args) { 
            21.         Test test = new Test(); 
            22.     } 
            23.  
            24. class Parent{ 
            25.  
            26.     public String field = "父類變量";// 變量 
            27.     public static String staticField = "父類靜態變量"; // 靜態變量 
            28.     // 靜態初始化塊 
            29.     static { 
            30.         System.out.println(staticField); 
            31.         System.out.println("父類靜態初始化塊"); 
            32.     } 
            33.     // 初始化塊 
            34.     { 
            35.         System.out.println(field); 
            36.         System.out.println("父類初始化塊"); 
            37.     } 
            38.     // 構造器 
            39.     public Parent() { 
            40.         System.out.println("父類構造器"); 
            41.     }    
            剛才結果應該是:
            父類靜態變量
            父類靜態初始化塊
            子類靜態變量
            子類靜態初始化塊
            父類變量
            父類初始化塊
            父類構造器
            子類變量
            子類初始化塊
            子類構造器
             
            從結果看到,并不是父類完全初始化完后再進行子類的初始化,子類的靜態變量和靜態初始化塊的初始化是在父類的變量、初始化塊和構造器初始化之前就完成了。
             
            我們在main方法再創建一個對象,Test test2 = new Test();
            大家就test2的初始化又如何?
             
            為了好看,我們子類構造器里加多行代碼System.out.println("***********");
            輸出結果:
            父類靜態變量
            父類靜態初始化塊
            子類靜態變量
            子類靜態初始化塊
            父類變量
            父類初始化塊
            父類構造器
            子類變量
            子類初始化塊
            子類構造器
            ***********
            父類變量
            父類初始化塊
            父類構造器
            子類變量
            子類初始化塊
            子類構造器
            ***********


            發現什么了?
            靜態變量和靜態代碼塊只加載一次 。
             
             
            總結:
            一、初始化優先級:
            1、靜態變量/靜態初始化塊)>(變量/初始化塊)>構造器
            2、父類>子類

            二、靜態變量和靜態代碼塊只加載一次,因為它們是全局共享的
             
            posted on 2012-07-28 12:45 tbwshc 閱讀(916) 評論(0)  編輯 收藏 引用
            久久五月精品中文字幕| 久久久久久精品久久久久| 国产精品一久久香蕉国产线看| 亚洲AV日韩精品久久久久久久| 久久国产亚洲精品无码| 久久精品三级视频| 99久久精品免费看国产一区二区三区| 久久国产欧美日韩精品 | 久久久久久久97| 国产Av激情久久无码天堂| 久久中文字幕无码专区| 久久久久成人精品无码中文字幕| 狠狠色丁香婷综合久久| 亚洲欧洲久久久精品| 精品久久一区二区| 国产成人无码精品久久久性色| 日本精品久久久久中文字幕| 久久久久波多野结衣高潮| 国产AⅤ精品一区二区三区久久| 精品久久久久久中文字幕大豆网| 伊人久久综合热线大杳蕉下载| 亚洲中文字幕无码久久综合网| 伊人久久大香线焦综合四虎 | 一本色道久久HEZYO无码| 国产三级精品久久| 久久91综合国产91久久精品| 国产69精品久久久久久人妻精品| 人妻中文久久久久| 国产精品亚洲美女久久久| 国产麻豆精品久久一二三| 伊人久久综合成人网| 99久久国产宗和精品1上映 | 国产精品热久久毛片| 久久精品成人免费网站| 国产午夜精品理论片久久影视| 日日噜噜夜夜狠狠久久丁香五月| 久久天天躁狠狠躁夜夜2020一 | 精品熟女少妇a∨免费久久| 亚洲午夜久久久久久久久电影网| 久久99热这里只有精品66| 777午夜精品久久av蜜臀|