为什么首先执行实例初始化块而不是构造函数?

时间:2015-09-09 14:22:34

标签: java constructor instance

我无法确切地知道为什么这段代码会输出0?

public class Poly
{
    public static void main(String[] args)
    {
        Square sq=new Square(10);
    }
}

class Square 
{
    int side;
    Square(int a)
    {
        side=a;
    }
    {
        System.out.print("The side of square is : "+side);
        System.out.println();
    }
}

我想问的是什么 -

  1. 为什么显示输出0而不是10?

  2. 为什么实例初始化块首先进行初始化然后再进行初始化 构造

2 个答案:

答案 0 :(得分:3)

完全初始化整个对象并不是实例初始化程序的工作,您可以拥有多个初始化程序,每个初始化程序都处理不同的事情。当您有多个初始化块时,它们按照它们在文件中出现的顺序运行,从上到下,并且它们不能包含前向引用。 This article by Bill Venners有很多有用的细节。

另一方面,构造函数 负责初始化整个对象。构造函数运行后,初始化对象,它应该处于有效状态并准备好使用。

因此,如果实例初始化程序在构造函数之后运行,它将不会进行初始化,那么它将改变已经设置的内容。所以初始化器必须在构造函数之前运行。

答案 1 :(得分:0)

顺序是这样的,静态块先行,然后是非静态块。然后是构造函数。