代码块的概述和分类
什么是代码块
在Java中用{}括起来的称为代码块。
代码块分类
1.局部代码块
在方法中出现;限定变量生命周期,及早释放,提高内存利用率。
代码如下:
public class Demo {
public void jubu(){
System.out.println("这是一个局部代码块");
}
public static void main(String[] args) {
Demo demo = new Demo();
demo.jubu();
}
}
执行结果:
2.构造代码块
1)在Java类中方法外用{}声明的代码块。
2)构造代码块在创建对象时被调用,每次创建对象都会调用一次,但是优先于构造函数执行。如果不实例化对象,构造代码块是不会执行的。如果存在多个构造代码块,则执行顺序按照书写顺序依次执行。
3)和构造函数的作用类似,都能对对象进行初始化,并且只要创建一个对象,构造代码块都会执行一次。但是反过来,构造函数则不一定每个对象建立时都执行(多个构造函数情况下,建立对象时传入的参数不同则初始化使用对应的构造函数)。
4)利用每次创建对象的时候都会提前调用一次构造代码块特性,我们可以做诸如统计创建对象的次数等功能。
代码如下:
public class Demo {
{
System.out.println("这是一个构造代码块");
}
public Demo(){
System.out.println("这是一个无参构造函数");
}
public static void main(String[] args) {
Demo demo = new Demo();
}
}
执行结果:
3.静态代码块
1)在java类中(方法中不能存在静态代码块)使用static关键字和{}声明的代码块。
2)静态代码块在类被加载的时候就运行了,而且只运行一次,并且优先于各种代码块以及构造函数。如果一个类中有多个静态代码块,会按照书写顺序依次执行。
3)一般情况下,如果有些代码需要在项目启动的时候就执行,这时候就需要静态代码块。比如一个项目启动需要加载的很多配置文件等资源,我们就可以都放入静态代码块中。
普通方法,通过加载类,然后new出实例化对象,通过对象才能运行这个方法。而静态代码块只需要加载类之后就能运行了。
对于静态方法,在类加载的时候,静态方法也已经加载了,但是我们必须要通过类名或者对象名才能访问,也就是说相比于静态代码块,静态代码块是主动运行的,而静态方法是被动运行的。
4)静态代码块不能访问普通变量
普通变量只能通过对象来调用,是不能放在静态代码块中的。
代码如下:
public class Demo {
static {
System.out.println("这是静态代码块");
}
public static void main(String[] args) {
Demo demo = new Demo();
}
}
执行结果:
这是静态代码块
4.同步代码块
使用synchronized(){}包裹起来的代码块,在多线程环境下,对共享数据的读写操作是需要互斥进行的,否则会导致数据的不一致性。同步代码块需要写在方法中。
代码块执行顺序
静态代码块>构造代码块>构造函数>普通代码块
代码如下:
public class Demo {
public void jubu(){
System.out.println("这是一个局部代码块");
}
{
System.out.println("这是一个构造代码块");
}
public Demo(){
System.out.println("这是一个无参构造函数");
}
static {
System.out.println("这是静态代码块");
}
public static void main(String[] args) {
new Demo().jubu();
System.out.println("---------------");
new Demo().jubu();
}
}
执行结果:
创建了两个匿名对象,静态代码块只执行一次。