隨筆-95  評論-31  文章-10  trackbacks-0
          如果一個類有父類,并且該類里面存在super、this、非靜態代碼塊,靜態代碼塊,靜態變量,非靜態變量,那么初始化這個類的時候順序是什么?
          示例:

          package com.lx;

          public class Son extends Parent
          {    
              
          final static Son INSTANCE = new Son(2.8);
              
          static double initCount =20;
              
          double currentCount;
              {
                  currentCount 
          = 15;
              }
              
              
          static{
                  initCount 
          =22.8;
              }
              
              
          public Son(){
                  System.out.println(
          "執行son的無參構造");
              }
              
              
          public Son(double discount){
                  
          this();
                  System.out.println(
          "執行son的構造函數");
                  System.out.println(currentCount);
                  currentCount 
          = initCount - discount;
                  System.out.println(currentCount);
              }
              
              
          public static void main(String[] args)
              {
                  System.out.println(Son.INSTANCE.currentCount);
                  
          //        Son son = new Son(1.8);
              }

          }
          package com.lx;

          public class Parent
          {
              double a;
              static double b ;
              
              public Parent(){
                  System.out.println(a);
                  System.out.println(b);
                  System.out.println("執行parent的無參構造");
              }
              
              {
                  a = 2.33;
              }
              
              static{
                  b = 33.33;
              }
          }

          順序是首先調用父類的構造,然后進行static的和非static的初始化,這兩步都合并到構造里面進行,初始化的賦值取決于在類里面的順序,但是都在構造執行的前面執行。
          如果一定要給個順序:那么是這樣
          分配子類的變量空間賦值為null或者為0
          接著super父構造,父構造里面執行前先分配內存空間并賦值,執行構造
          然后回到子類,進行變量的賦值操作,順序為類里面代碼的順序(指的是代碼塊和賦值語句的順序),然后才會執行構造函數里面的內容。
          其中有一點:非靜態的代碼塊以及實例變量的賦值語句,執行在構造函數內容之前,super之后。然而靜態的代碼塊以及類變量的賦值語句,與new 構造無關,只和代碼里面的順序有關,但是
          new 構造會觸發static的賦值時機,即在類中從上到下進行static的賦值,如果static的變量賦值不是上面代碼那樣static Son INSTANCE = new Son(2.8);那么同樣會在構造函數之前進行賦值,然后在調用構造函數內容。即像父類Parent輸出那樣,其中a=2.33 b=33.33 而不是想象中的a=2.33 b=0.0
          但是子類Son里面,觸發static初始化賦值時機后,從上到下開始賦值但是INSTANCE = new Son(2.8);執行構造 同樣會觸發static的變量賦值,但是發現必須要先執行new Son(2.8)進行INSTANCE賦值,但是initCount還沒有進行賦值,只是簡單的初始化分配了內存值為0.0,所以就輸出了負數。
          最后main里面執行Son son = new Son(2.8)的時候,仍然進行了兩次對INSTANCE的賦值,第一次出現的就是負數,第二次出現的是正數了,因為initCount已經賦值了。

          所以補充一點:構造進行初始化的時候,會對所有的靜態和非靜態代碼塊和賦值語句,進行賦值,這一步執行操作在super之后,構造函數內容之前。非靜態代碼塊和實例變量賦值,無論如何都會執行,而靜態的代碼塊和類變量賦值則不一定,這個可以把
          final static Son INSTANCE = new Son(2.8);
          修改為Son INSTANCE = new Son(2.8);
          再執行的話,會發現一直在進行new Son(2.8)的操作,一直到拋出
          Exception in thread "main" java.lang.StackOverflowError異常,這說明構造初始化的時候,會強制性的進行非靜態代碼塊或者實例變量的賦值。



          posted on 2012-06-12 20:31 朔望魔刃 閱讀(321) 評論(0)  編輯  收藏 所屬分類: java
          <2012年6月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          1234567

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          收藏夾

          娛樂博客

          牛博

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 闸北区| 日喀则市| 石棉县| 福安市| 商都县| 通许县| 饶平县| 虎林市| 鹰潭市| 嵊州市| 保德县| 内江市| 环江| 中江县| 乌审旗| 揭西县| 南华县| 沙河市| 吴旗县| 北川| 昌黎县| 德惠市| 响水县| 汕头市| 荆州市| 阳朔县| 德州市| 聊城市| 嘉兴市| 衡水市| 葫芦岛市| 沾益县| 壤塘县| 金溪县| 太仓市| 三台县| 东阳市| 宜阳县| 永寿县| 甘南县| 黄梅县|