概要:本文通過查看一個精心構造的類結構的運行輸出和使用javap工具查看實際生成的java字節碼(bytecode)向java程序員展示了一個類在運行時是如何構造生成的。
要害字: java 構造 javap 字節碼 bytecode
按照java規范,一個類實例的構造過程是遵循以下順序的:
1.假如構造方法(constrUCtor,也有翻譯為構造器和構造函數的)是有參數的則進行參數綁定。
2.內存分配將非靜態成員賦予初始值(原始類型的成員的值為規定值,例如int型為0,float型為0.0f,boolean型為false;對象類型的初始值為null),靜態成員是屬于類對象而非類實例,所以類實例的生成不進行靜態成員的構造或者初始化,后面將講述靜態成員的生成時間。
3.假如構造方法中存在this()調用(可以是其它帶參數的this()調用)則執行之,執行完畢后進入第6步繼續執行,假如沒有this調用則進行下一步。
4.執行顯式的super()調用(可以是其它帶參數的super()調用)或者隱式的super()調用(缺省構造方法),此步驟又進入一個父類的構造過程并一直上推至Object對象的構造。
5.執行類申明中的成員賦值和初始化塊。
6.執行構造方法中的其它語句。
現在來看看精心構造的一個實例:
class Parent
{
int pm1;
int pm2=10;
int pm3=pmethod();
{
System.out. }
public static int spm1=10;
static
{
System.out.println("Parent's static initialize block");
}
Parent()
{
System.out.println("Parent's default constructor");
}
static void staticmethod()
{
System.out.println("Parent's staticmethod");
}
int pmethod()
{
System.out.println("Parent's method");
return 3;
}
}
class Child extends Parent
{
int cm1;
int cm2=10;
int cm3=cmethod();
Other co;
public static int scm1=10;
{
System.out.println("Child's instance initialize block");
}
static
{
System.out.println("Child's static initialize block");
}
Child()
{
co=new Other();
System.out.println("Child's default constructor");
}
Child(int m)
{
this();
cm1=m;
System.out.println("Child's self-define constructor");
}
static void staticmethod()
{
System.out.println("Child's staticmethod");
}
int cmethod()
{
System.out.println("Child's method");
return 3;
}
}
class Other
{
int om1;
Other() {
System.out.println("Other's default constructor");
}
}
public class InitializationTest
{
public static void main(String args[])
{
Child c;
System.out.println("program start");
新聞熱點
疑難解答