JAvaクラスの初期化プロセス
『javaプログラミング思想』(第4版)146ページでは、初期化の場所はstatic初期化が発生した場所であり、すべてのstaticオブジェクトとstaticコードセグメントはロード時にプログラム内の順序に従って初期化されると述べている.
実行結果:
コードの59行を注釈してmain関数を実行し、実行結果は次のようになります.
最後にクラスの初期化プロセスをまとめます.
(1)継承関係であれば,まずベースクラスから順に初期化する.
(2)staticの属性とコードセグメント------ロードクラスの場合
(3)staticの属性とコードセグメント,非静的属性,コンストラクタ ---初期化オブジェクトの場合
(4)stasticの方法は,クラスを再ロードしたり,オブジェクトを初期化したりしないときに初期化する.
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の方法は,クラスを再ロードしたり,オブジェクトを初期化したりしないときに初期化する.