龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > JAVA开发 >

分享JAVA类初始化顺序,经典例程

时间:2009-12-23 15:42来源:未知 作者:admin 点击:
分享到:
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{ { i

  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调用创建的时候才会被JAVA类装载器装入
  
  2、JAVA类首次装入时,会对静态成员变量或方法进行一次初始化
  
  3、创建类实例时,首先按照父子继续关系进行初始化
  
  4、类实例创建时候,首先初始化块部分先执行,然后是构造方法;然后从本类继续的子类的初始化块执行,最后是子类的构造方法
  
  5、类消除时候,
  
精彩图集

赞助商链接