Java中构造代码块的使用

例子1


public class Client {
    {
        System.out.println("执行构造代码块1");
    }

    {
        System.out.println("执行构造代码块2");
    }

    public Client(){
        System.out.println("执行无参构造");
    }

    public Client(int i){
        System.out.println("执行有参构造1");
    }
    
    public static void main(String[] args) {
        new Client();
        new Client(5);
    }
}

执行构造代码块1
执行构造代码块2
执行无参构造
执行构造代码块1
执行构造代码块2
执行有参构造1

结论:在通过new关键字生成一个实例时会先执行构造代码块(相当于把构造块的代码插入到构造函数的最前端),然后再执行其他代码,也就是说:构造代码块会在每个构造函数内首先执行(需要注意的是:构造代码块不是在构造函数之前运行的,它依托于构造函数的执行),同时构造代码块的执行顺序为语句编写顺序。

例子2


public class Client {
    {
        System.out.println("执行构造代码块1");
    }

    {
        System.out.println("执行构造代码块2");
    }

    public Client(){
        System.out.println("执行无参构造");
    }

    public Client(int i){
        System.out.println("执行有参构造1");
    }

    public Client(String str){
        this();
        System.out.println("执行有参构造2");
    }

    public static void main(String[] args) {
        new Client();
        new Client(5);
        new Client("hello");
    }
}
执行无参构造
执行构造代码块1
执行构造代码块2
执行有参构造1
执行构造代码块1
执行构造代码块2
执行无参构造
执行有参构造2

结论:特殊情况-如果遇到this关键字(也就是构造函数调用自身其他的构造函数时)则不插入构造代码块,对于我们的例子来说,编译器在编译时发现String形参的构造函数调用了无参构造,于是放弃插入构造代码块,所以只执行了一次构造代码块.。
延伸:在构造代码块的处理上,super方法没有任何特殊的地方,编译器只是把构造代码块插入到super方法之后执行而已