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

  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、类消除时候,首先消除子类部分,再消除父类部分
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值