package c06;
import java.util.*;
public class ClassOrderTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new ClassB().display();
new ClassB().dispA();
System.gc();
}
}
class ClassA{
{
int x=100,y=getNumber(100);
System.out.println("ClassA.init block:x="+x+":y="+y);
}
static{
int sx=100,sy=getNumber(100);
System.out.println("ClassA.static block:sx="+sx+":sy="+sy);
}
int ix=(int)(Math.random()*100);
final int iy=(int)(Math.random()*100);
static int iz=getNumber(100);
int ax=getNumber(100);
static void dispA(){
System.out.println("ClassA.dispA()");
}
static int getNumber(int base){
System.out.println("ClassA.getNumber(int base)");
return (int)(Math.random()*base);
}
void display(){
System.out.println("ix="+this.ix);
System.out.println("iy="+this.iy);
System.out.println("iz="+this.iz);
System.out.println("ax="+this.ax);
dispA();
}
ClassA(){
System.out.println("ClassA.constructor");
}
protected void finalize(){
System.out.println("ClassA.destructor");
}
}
class ClassB extends ClassA{
static{
System.out.println("ClassB.static block");
}
protected void finalize() {
System.out.println("ClassB.destructor");
super.finalize();
}
{
int bx=100;
System.out.println("ClassB.init block:bx="+bx);
}
ClassB(){
super();
System.out.println("ClassB.Constructor");
}
}
/*
* 運行結果
ClassA.getNumber(int base)
ClassA.static block:sx=100:sy=54
ClassA.getNumber(int base)
ClassB.static block
ClassA.getNumber(int base)
ClassA.init block:x=100:y=74
ClassA.getNumber(int base)
ClassA.constructor
ClassB.init block:bx=100
ClassB.Constructor
ix=78
iy=78
iz=52
ax=82
ClassA.dispA()
ClassA.getNumber(int base)
ClassA.init block:x=100:y=88
ClassA.getNumber(int base)
ClassA.constructor
ClassB.init block:bx=100
ClassB.Constructor
ClassA.dispA()
ClassB.destructor
ClassA.destructor
ClassB.destructor
ClassA.destructor
總結:
1、類只有在使用New調用創(chuàng)建的時候才會被JAVA類裝載器裝入
2、JAVA類首次裝入時,會對靜態(tài)成員變量或方法進行一次初始化
3、創(chuàng)建類實例時,首先按照父子繼承關系進行初始化
4、類實例創(chuàng)建時候,首先初始化塊部分先執(zhí)行,然后是構造方法;然后從
本類繼承的子類的初始化塊執(zhí)行,最后是子類的構造方法
5、類消除時候,首先消除子類部分,再消除父類部分
*/