需要有关Java构造的信息

时间:2016-03-09 18:58:30

标签: java constructor

我最近注意到java中的这个构造允许在构造函数被调用之前执行代码:

public class Foo {

    {
        System.out.println("before constructor 1");
    }

    public Foo () {
        System.out.println("constructor");
    }


    {
        System.out.println("before constructor 2");
    }

}

使用此类时,调用构造函数时:

new Foo();

这到达输出:

before constructor 1
before constructor 2
constructor

我想了解更多关于这个结构的信息:它是如何调用的,当它被添加时,文档页面网址...

1 个答案:

答案 0 :(得分:4)

这是instance initialiser block

编译器按照给定的顺序连接类中的所有实例初始化块,然后将结果复制到所有构造函数的开头,包括隐式的无参数(如果适用)。

这些语义的唯一不同之处在于,如果您只是将此代码复制到构造函数中,那么就是在进行超类构造函数调用时。实例初始化程序允许您拥有在调用super()之前运行的代码,但语言规则不允许您使用此属性编写构造函数。

类似的机制用于处理字段初始化程序。当您定义这样的字段时:

int something = 3;

它将生成something = 3并将其复制到每个构造函数的开头(之前任何实例初始化者)。

同样有趣的是static initialiser blocks