JAvaクラスの初期化プロセス


『javaプログラミング思想』(第4版)146ページでは、初期化の場所はstatic初期化が発生した場所であり、すべてのstaticオブジェクトとstaticコードセグメントはロード時にプログラム内の順序に従って初期化されると述べている.
 
 
package com.woyo.init;
/** 
 *@author Antty_ge
 *@date 2010-12-25
 */
class InitParent{
    
    public static int parentId= getParentId(44, true);
    public int id = getParentId(1, false);
    
    static{
        System.out.println("==this is the parent static block===");
    }
    
    public InitParent(){
        System.out.println("===parent   ");
    }
    
    public static void getParentName(){
        System.out.println("==parent name is antty");
    }
    
    public static int getParentId(int id){
        System.out.println("==parent id is " + id);
        return id;
    }
    public static int getParentId(int id, boolean staticSign) {
        if(staticSign){
            System.out.println("==       parent id is " + id);
        }else{
            System.out.println("===         id is" + id);
        }
        return id;
    }
}

class InitChild extends InitParent{
    
    public static int childId =  getChildId(22, true);
    public int id = getChildId(1, false);

    static{
        System.out.println("==this is the child static block===");
    }
    
    public InitChild(){
        System.out.println("===child   ");
    }
    
    public static void getChildName(){
        System.out.println("==child name is bob");
    }
    
    public static int getChildId(int id, boolean staticSign) {
        if(staticSign){
            System.out.println("==       child id is " + id);
        }else{
            System.out.println("===         id is" + id);
        }
        return id;
    }
}

public class Initialization extends InitChild{
   
    public static void main(String[] args) {
       Initialization init = new Initialization();  //     
    }
}

 実行結果:
 
==       parent id is 44
==this is the parent static block===
==       child id is 22
==this is the child static block===
===         id is1
===parent   
===         id is1
===child   

 
 
コードの59行を注釈してmain関数を実行し、実行結果は次のようになります.
 
==       parent id is 44
==this is the parent static block===
==       child id is 22
==this is the child static block===

 
 
最後にクラスの初期化プロセスをまとめます.
 
(1)継承関係であれば,まずベースクラスから順に初期化する.
(2)staticの属性とコードセグメント------ロードクラスの場合
(3)staticの属性とコードセグメント,非静的属性,コンストラクタ ---初期化オブジェクトの場合
(4)stasticの方法は,クラスを再ロードしたり,オブジェクトを初期化したりしないときに初期化する.