[转贴] Java程序初始化顺序

 

import  java.util. * ; public   class  Demo  {   static   {      System.out.println( " i am static demo. " );  }   {      System.out.println( " i am  demo. " );  }   static   void  print() {   System.out.println( " can omit instance initialization? " );  }   public   static   void  main(String[] args)  {    new  Sub( " child " );   Demo.print();  } } abstract   class  Base  {   public  String name  =   "    " ; public  String sex = " base " ;   public  Base(String name)  {   System.out.println( " name: "   +   this .name);    this .name  =  name;   System.out.println( " invoke base constructor " );   System.out.println( " name: "   +  name);    this .setName( " parent " );  }   {   System.out.println( " invoke base instance block " );   System.out.println( " this.sex: " + this .sex);   printInfo();  }   static   {   System.out.println( " invoke base static block " );  }   //  public abstract void setName();   public   abstract   void  printInfo();   public   void  setName(String name)  {    this .name  =  name;   System.out.println( " invoke parent setName method " );   System.out.println( " name: "   +  name);  } } class  Sub  extends  Base  {   public   static   int  age  =   10 ; public  String sex = " sub " ;   public  Sub(String name)  {    super (name);   System.out.println( " invoke sub constructor " );   System.out.println( " name: "   +  name);  }   {   System.out.println( " invoke sub instance block " );   System.out.println( " name: "   +  name);  }   static   {   System.out.println( " invoke sub static block " );  }   public   void  printInfo()  {   System.out.println( " " );   System.out.println( " invoke sub printInfo " );   System.out.println( " age: "   +  age);   System.out.println( " name: "   +  name);   System.out.println( " " );  }   public   void  setName(String name)  {   System.out.println( " invoke sub setName method " );    this .name  =  name;   System.out.println( " name: "   +  name);  } }

 

输出结果;

i am static demo. invoke base static block invoke sub static block invoke base instance block this.sex:base

invoke sub printInfo age:10 name: 

name:  invoke base constructor name:child invoke sub setName method name:parent invoke sub instance block name:parent invoke sub constructor name:child can omit instance initialization? 初始化的实际过程为:

  1. 在其它任何事物发生之前,将分配给对象的存储空间初始化成二进制的零。
  2. 父类static 块或变量
  3. 子类static块或变量
  4. 父类的显式初始化
  5. 父类构造函数
  6. 子类的显式初始化
  7. 子类的构造函数
此过程中若有父类构造体中调用方法可被子类重载,则JVM会从最低子类对象处寻找此方法,找到则执行,虽然此时对象还未完全生成(可能会造成潜在的错误)。 转自 http://blog.csdn.net/JefferyLee/archive/2007/08/13/1741668.aspx
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值