Java代码块的一知半解

    今天和同事聊天聊到代码块上,一直只认为代码块只是帮助初始化,比如说静态代码块只执行一次,构造代码块每构建一个对象时都会调用,同步代码块不提了。。。。。

    首先先定义: 代码块(Code Block)就是用大括号把多行的代码封装在一起,形成独立的数据体的代码集合。简单展现下静态代码块和代码块:

class ClassName {
    {//这是代码块}
    static{//这是静态代码块}
}

    看起来很简单吧,只不过一个有static,一个没有。借助下面例子简单说下其特点:

class Block {
	//有4个构造函数的类-----以下为节省空间写成一行。
	public Block() {System.out.println("construcor called.");}
	public Block(int i) {}
	public Block(String s) {}
	public Block(char c) {this();}

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

public class Blocks {
	public static void main(String[] args) {
		new Block();
		new Block('a');
		new Block("xxx");
		new Block(1);
	}
}

    //:~控制台显示如下:

static block called.
no-static block called.
construcor called.
no-static block called.
construcor called.
no-static block called.
no-static block called.

    说明静态代码块只会在类加载的时候调用一次,加载完就不再调用。而构造代码块每次实例化一个对象,都会调用一次。且会在构造器中的代码调用之前调用,在上面代码的第2,3行可以看出。

    既然每实例化时候都会调用构造代码块,那么请观察:

public Block(char c) {this();}

这行代码对应的打印为:

no-static block called.
construcor called.

    虽然构造器中调用了其他构造器,构造代码块只执行了一次。为什么呢?jvm是非常聪明的,对于调用其他构造函数的构造函数,jvm只会调用一次构造器。

    那么说到这,构造代码块有什么用呢、?...既然每次调用构造函数(构建每个对象)都会调用且只调用一次,那这不是一个提出共有代码的好方法吗?当你需要在每一个构造参数内添加同样的初始化代码时,不妨将其提出放入构造代码块中,而对于只加载一次的文件,或者在类初始化时只进行一次的操作,不妨放在静态代码块中。

你可能感兴趣的:(Java代码块的一知半解)