2011-04-19 152 views
1

当我运行下面的代码我得到的输出为:没有名字的Java构造函数?

static block 
TEst block 
main block 

怎样字符串“试块”被印?它被认为是构造函数吗?

public class TestBlk { 

static { 
    System.out.println("static block"); 
} 

{ 
    System.out.println("TEst block"); 
} 


public static void main(String args[]){ 
    TestBlk blk=new TestBlk(); 
    System.out.println("main block"); 

} 
} 

回答

12

这是一个实例初始化器,连同默认构造函数。

没有显式构造函数的类被赋予了一个合成的,公共的,无参数的构造函数。

未调用this()super()(可能带参数)的构造函数被给予super()的隐式调用(没有参数,可能在内部类中出现奇怪的情况)。

紧接在对super()的隐式或显式调用之后,字段初始化程序和实例初始化程序中的所有代码都按其出现在源代码中的顺序插入。

的javac已经与你的代码完成后,所以它看起来有点像:

public class TestBlk { 

    static { 
     System.out.println("static block"); 
    } 

    public TestBlk() { 
     // Call constructor of java.lang.Object. 
     super(); 

     // From instance (and field)initialiser. 
     System.out.println("TEst block"); 

     // Rest of constructor: 
    } 


    public static void main(String args[]){ 
     TestBlk blk = new TestBlk(); 
     System.out.println("main block"); 
    } 
} 
0

,当你调用new TestBlk()它被称为对象结构的一部分。

2

你在这里叫做:初始化块。

的初始化块是执行 类的对象之前是 创建的 代码大括号之间的块。

有两种类型的初始化块:

  1. 非静态初始化块。

    { System.out.println("TEst block"); }

  2. 静态初始化块。

    static { System.out.println("static block"); }

更具体的,我喜欢here的解释:

注意,任何初始化块 存在于类被构造之前执行 。

所以,现在问题来了,为什么我们需要 构造如果我们有初始化块。答案是我们不需要的默认构造函数 但初始化块 无法参数,所以你 不能有取值从 出端对象等初始化块 不是构造函数的替代品。