<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-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 朔望魔刃 閱讀(318) 評論(0)  編輯  收藏 所屬分類: java
    主站蜘蛛池模板: 99在线视频免费观看| 亚洲娇小性色xxxx| 亚洲va久久久噜噜噜久久| 亚洲愉拍99热成人精品热久久| 亚洲一级黄色视频| 国产V亚洲V天堂A无码| 久久久亚洲精品无码| 亚洲宅男天堂a在线| 亚洲av无码专区在线观看下载| 国产亚洲综合久久| 不卡视频免费在线观看| 最近中文字幕大全中文字幕免费| 最近中文字幕大全免费视频| 在线观看免费大黄网站| 亚洲人成网站18禁止一区| 亚洲va久久久噜噜噜久久狠狠| 亚洲精品美女久久久久| 蜜桃传媒一区二区亚洲AV | 精品亚洲综合在线第一区| 久久久婷婷五月亚洲97号色 | 亚洲av高清在线观看一区二区| 亚洲日本一区二区一本一道| 久久亚洲国产精品一区二区| 亚洲人成毛片线播放| 丰满少妇作爱视频免费观看| 一级成人a毛片免费播放| 嫩草视频在线免费观看| 亚洲精品少妇30p| 亚洲国产精品嫩草影院| 免费国产成人α片| 国产精品公开免费视频| 亚洲视频一区调教| 未满十八私人高清免费影院| 国产高清免费视频| 亚洲AV无码精品无码麻豆| 亚洲AV第一成肉网| 国产成人无码免费看视频软件| 亚洲乱亚洲乱妇无码麻豆| 国产精品亚洲一区二区在线观看| 最近中文字幕mv免费高清在线| 国产偷国产偷亚洲高清日韩|