关于java初始化顺序的一个示例

public   class  Sample
{
    
public   static   void  main(String[] args){
        B ba 
=   new  B();
        
        System.out.println(
" ------------------------------- " );

        B bb 
=   new  B();
    }
};


class  Target
{
    
public  Target(String s){
        System.out.println(
" Target( " + s + " ) " );
    }
};

class  A
{
    
    
public   static  Target td  =   new  Target( " static in A " );
    
static {
        System.out.println(
" static block in A " );
    }

    {
        System.out.println(
" non-static block in A " );
    }

    
public  Target ta  =   new  Target( " in A " );
};

class  B  extends  A
{
    
public  Target tb  =   new  Target( " in B " );
    
static {
        System.out.println(
" static block in B " );
    }
    
static   public  Target tc  =   new  Target( " static in B " );

    {
        System.out.println(
" non-static block in B " );
    }
    
};
 

结果:
Target( static   in  A)
static  block  in  A
static  block  in  B
Target(
static   in  B)
non
- static  block  in  A
Target(
in  A)
Target(
in  B)
non
- static  block  in  B
-------------------------------
non
- static  block  in  A
Target(
in  A)
Target(
in  B)
non
- static  block  in  B



注意:
  1. All data fields are initialized to their default value (0, false, or null).

  2. All field initializers and initialization blocks are executed, in the order in which they occur in the class declaration.

  3. If the first line of the constructor calls a second constructor, then the body of the second constructor is executed.

  4. The body of the constructor is executed。


另外,可以看到:
先父类的static,后子类的static,然后父类的非static,再子类的非static。
static包括静态的字段和初始化块。
非static包括非静态字段和初始化块。
同级别的字段或初始化块的顺序就依赖于定义的先后了。

还有一点简单的,顺便提一下:
static的东东只在类装入的时候,执行一次。不是每次实例化一个对象时都执行。

顺便提第二点:在jdk5中因为支持可变参数列表所以,
public   static   void  main(String... args) {}

是成立的。

另外,关于初始化问题参见:
http://www.javaworld.com/javaworld/jw-03-1998/jw-03-initialization.html?page=1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值