在Java中被{}括起来的语句块称为代码块。
1.普通块,也就是局部代码块。它存在的意义是控制变量的生命周期。因为在局部代码块中的变量在外面是访问不到的,所以当我们的变量只需要用到一次的时候,即可写在局部代码块中,防止其久驻内存,占用空间。
public void show(){
{
System.out.println("局部代码块运行!");
}
}
2.构造代码块。它的作用是用来统一为对象初始化。当我们有多个构造方法时,new多个对象会根据传递的参数不同而去调用不同的构造方法,所以new出来的对象也就不同,构造代码块就是为了给对象共性的内容进行统一初始化。无论建立哪个对象,都会先执行相同的构造代码块,所以构造代码块的调用顺序先于构造方法。执行顺序:静态代码块 > 构造代码块 > 构造函数。
什么时候用构造代码块呢?
1、 初始化实例变量
如果一个类中存在若干个构造函数,这些构造函数都需要对实例变量进行初始化,如果我们直接在构造函数中实例化,必定会产生很多重复代码,繁琐和可读性差。这里我们可以充分利用构造代码块来实现。这是利用编译器会将构造代码块添加到每个构造函数中的特性。
2、 初始化实例环境
一个对象必须在适当的场景下才能存在,如果没有适当的场景,则就需要在创建对象时创建此场景。我们可以利用构造代码块来创建此场景,尤其是该场景的创建过程较为复杂。构造代码会在构造函数之前执行。
比如当我们所有的汽车都是四个轮胎,那这种共性的东西就可以放在构造代码块中。
public class Car{
private intwheel_num;
//构造代码块
{
System.out.println("构造代码块运行!");
wheel_num= 4;
}
}
3.静态代码块。它的作用主要是(1)给类的静态变量赋值,(2)声明静态变量。静态代码块在类加载过程中的初始化阶段执行,并且只执行一次。使用static静态代码块进行初始化与直接在定义变量的时候初始化效果是一样的,但是它们的先后顺序可能会对变量的值造成影响。后执行的赋值会覆盖之前的值。
public class Test {
public static int a = 1;
public static int b = 3;
public static String str;
static {
str = "hello world";
a = 10;
b = 30;
}
public static void main(String[] args) {
System.out.println(Test.str);
System.out.println(Test.a);
System.out.println(Test.b);
}
}
输出:
hello world
10
30
4.同步代码块。
使用 synchronized 关键字修饰,并使用“{}”括起来的代码片段,它表示同一时间只能有一个线程进入到该方法块中,是一种多线程保护机制。