【转】构造代码块

原文链接:https://blog.csdn.net/hspingcc/article/details/54893853

Java中有四种代码块:

  • 普通代码块

    就是在方法后面使用”{}”括起来的代码片段,不能单独执行,必须调下其方法名才可以执行.

  • 静态代码块

    在类中使用static修饰,并使用”{}”括起来的代码片段,用于静态变量的初始化或对象创建前的环境初始化.

  • 同步代码块

    使用synchronize关键字修饰,并使用”{}”括起来的代码片段.它表示在同一时间只能有一个线程进入到该方法快中,是一种多线程保护机制.

  • 构造代码块

    在类中没与任何的前缀或后缀,并使用”{}”括起来的代码片段。执行时插入到构造函数前面。

由于是插入到构造函数的的前面,自然在通过new关键字生成一个实例的时候会先执行构造代码块,然后在执行其他代码(注意:构造代码块不是在构造函数之前运行,而是依托于构造函数,如果不执行构造函数就不执行构造代码块)。

举例:

public class Main {
    public static int count = 0;
    {
        count++;
    }

    public Main() {

    }

    public Main(int i) {
        this();
    }

    public Main(String string) {
    }

    public static void main(String[] args) {
        new Main();
        new Main(1);
        new Main("1");
        System.out.println(Main.count);
    }
}

答案是:3.

显然Java编译器是足够聪明的.这是因为,在插入到每个构造函数中的时候,有个例外,就是如果遇到this关键字(也就是构造函数调用自身其他的构造函数时)不插入构造代码块.

那为什么编译器这么聪明呢?这是因为构造代码块的出现就是为了提取构造函数的共同量,减少各个构造函数的代码而产生的.

最后还有一点需要注意的,千万不要认为this是特殊情况,那super也会类似处理.其实不会,在构造代码块的处理上,super方法没有任何特殊的地方.编译器只是把构造代码块插入到super方法之后执行而已.

猜你喜欢

转载自blog.csdn.net/wayne566/article/details/80207749