• <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 閱讀(914) 評論(0)  編輯 收藏 引用
            漂亮人妻被中出中文字幕久久| 久久久噜噜噜久久| 国内精品久久久人妻中文字幕| 久久久久久久久无码精品亚洲日韩 | 久久精品无码专区免费东京热| 久久精品国产99久久久| 亚洲一区中文字幕久久| 中文成人无码精品久久久不卡| 久久综合给合久久狠狠狠97色| 久久综合丁香激情久久| 久久久这里只有精品加勒比| 国产成年无码久久久久毛片| 久久亚洲中文字幕精品一区| 国产成人久久精品一区二区三区| 久久综合久久伊人| 亚洲国产精品久久久久网站| 99蜜桃臀久久久欧美精品网站| 久久精品亚洲日本波多野结衣 | 久久久久av无码免费网| 国产精品一区二区久久精品| 亚洲人成电影网站久久| 91精品婷婷国产综合久久| 无码国内精品久久人妻蜜桃| 日本加勒比久久精品| 99久久精品免费看国产| 久久综合久久自在自线精品自| 三级片免费观看久久| 国产福利电影一区二区三区久久久久成人精品综合 | 欧美伊人久久大香线蕉综合69| 久久精品水蜜桃av综合天堂 | 2019久久久高清456| 久久国产免费直播| 伊人久久免费视频| 99re这里只有精品热久久| 久久精品国产99国产精品亚洲| 久久精品免费大片国产大片| 青青草国产精品久久| 久久99国产精品久久| 久久男人Av资源网站无码软件 | 日韩AV毛片精品久久久| 国内精品欧美久久精品|