在Java中,使用{}括起来的代码被称为代码块,根据其位置和声明的不同,可以分为局部代码块(普通代码块),构造代码块,静态代码块,同步代码块。
一、局部代码块
public void xxx(){
//代码...
}
二、构造代码块
位置:在类中方法外出现,在每次创建对象时都会被调用;构造代码块中定义的变量是局部变量;
作用:多个构造方法方法中相同的代码存放到一起,每次调用构造代码块都执行,并且在构造方法前执行。
代码举例:
{
代码...
}
三、静态代码块
位置:在类中方法外出现,并加上static修饰;
作用:用于给类进行初始化,在加载的时候就执行,并且只执行一次。
代码举例:
static{
//代码...
}
四、同步代码块
位置:使用synchronized(obj){}包裹起来的代码块;
作用:在多线程环境下,对共享数据进行读写操作是需要互斥进行的,否则会导致数据的不一致性。常见的是synchronized用来修饰方法,其语义是任何线程进入synchronized需要先取得对象锁如果被占用了,则阻塞,实现了互斥访问共享资源。而synchronized也是有代价的。一个常见的场景是:一个冗长的方法中,其实只有一小段代码需要访问共享资源,这时使用同步块,就只将这小段代码裹在synchronized block,既能够实现同步访问,也能够减少同步引入的开销。
代码举例:
synchronized(obj){
//code
}
注意:同步代码块须写在方法中。
----------------------------------------------------------------------------------------------------
附:下面是一个代码块执行的例子:
class Demo{
static{
System.out.println("静态代码块");
}
{
//这是构造代码块,而且在new对象时,构造代码块优先于构造方法执行
System.out.println("构造代码块");
}
public Demo(){
System.out.println("构造方法");
}
}
public class Daimakuai {
static{
System.out.println("执行");//Daimakuai类加载时自动执行静态代码块
}
{
System.out.println("不执行");
}
public static void main(String[] args) {
System.out.println("main方法");
Demo d1 = new Demo();
Demo d2 = new Demo();
}
}
以上示例代码的执行结果为:
执行
main方法
静态代码块
构造代码块
构造方法
构造代码块
构造方法
执行顺序:
静态代码块 > 构造代码块 > 构造方法