• <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 閱讀(912) 評論(0)  編輯 收藏 引用
            国产精品99久久久久久人| 色诱久久久久综合网ywww| 久久精品国产免费观看三人同眠| 99久久国产亚洲高清观看2024 | 久久久99精品成人片中文字幕 | 久久综合色老色| 亚洲国产日韩欧美久久| 久久久久久夜精品精品免费啦| 国产精品va久久久久久久| 人妻无码精品久久亚瑟影视| 国产精品成人99久久久久 | 影音先锋女人AV鲁色资源网久久| 青青青伊人色综合久久| 久久婷婷五月综合国产尤物app | 国产成人香蕉久久久久| 久久综合亚洲色HEZYO社区| 久久久精品免费国产四虎| 色综合久久天天综线观看| 国产ww久久久久久久久久| 狠狠色丁香久久婷婷综合_中| 久久精品国产99国产精品澳门 | 国产69精品久久久久APP下载| www.久久精品| 国产成人精品综合久久久久| 国产精品99久久久久久www| 无码专区久久综合久中文字幕| 久久久久亚洲国产| 精品久久久久久国产三级| 久久久久国产一级毛片高清板| 国产精品无码久久综合| 久久精品亚洲日本波多野结衣 | 99久久精品国产一区二区| 日产精品久久久一区二区| 久久精品极品盛宴观看| 国産精品久久久久久久| 午夜不卡888久久| 久久综合久久久| 9999国产精品欧美久久久久久| 国产精品久久久久国产A级| 精品永久久福利一区二区| 看久久久久久a级毛片|