代码块

在 Java 中,使用{}括起来的代码被称为代码块,根据其位置和声明的不同,可以分为局部代码块,构造代码块,静态代码块,同步代码块(多线程)

构造代码块

COPY
格式:
{

}

注意

COPY
1、用于给对象初始化,多个构造方法中相同的代码存放到一起,每次调用构造方法都会执行,并且在构造方法前执行
2、只有创建对象时调用,类不能调用
3、构造代码块可以有多个,建议只写一个
class Person {
{
System.out.println("Person构造代码块执行");
}

public Person() {
System.out.println("Person构造方法执行");
}
}

public class TestPerson {
public static void main(String[] args) {
System.out.println("main方法");
new Person();
new Person();
}
}

静态代码块

COPY
格式:
static {

}

注意

COPY
1、用于给类进行初始化,在加载的时候就执行,并且只执行一次
2、优先级高于主函数
3、静态代码块可以有多个,顺序执行,建议只写一个
class Person {
static {
System.out.println("Person静态代码块执行");
}

public Person() {
System.out.println("Person构造方法执行");
}
}

public class TestPerson {
static {
System.out.println("静态代码块1执行");
}

public static void main(String[] args) {
System.out.println("main方法");
new Person();
new Person();
}

static {
System.out.println("静态代码块2执行");
}
}

结果

COPY
静态代码块1执行
静态代码块2执行
main方法
Person静态代码块执行
Person构造方法执行
Person构造方法执行

代码块相关执行顺序

COPY
public class Father {
public Father() {
System.out.println("父类构造方法执行~~~");
}

{
System.out.println("父类构造代码块执行~~~");
}

static {
System.out.println("父类静态代码块执行~~~");
}

public static void function() {
System.out.println("父类静态成员方法执行~~~");
}
}

public class Son extends Father{
public Son() {
System.out.println("子类构造方法执行~~~");
}

{
System.out.println("子类构造代码块执行~~~");
}

static {
System.out.println("子类静态代码块执行~~~");
}

public static void function() {
System.out.println("子类静态成员方法执行~~~");
}

public static void main(String[] args) {
System.out.println("main方法执行~~~");
new Son();
}
}

结果

COPY
父类静态代码块执行~~~
子类静态代码块执行~~~
main方法执行~~~
父类构造代码块执行~~~
父类构造方法执行~~~
子类构造代码块执行~~~
子类构造方法执行~~~

面试题

执行顺序

COPY
public class Test {
static Test test1 = new Test();
static Test test2 = new Test();

static {
System.out.println("静态代码块");
}

{
System.out.println("构造代码块");
}

public Test() {
System.out.println("构造方法");
}

public static void main(String[] args) {
System.out.println("main方法");
new Test();
}
}

结果

COPY
构造代码块
构造方法
构造代码块
构造方法
静态代码块
main方法
构造代码块
构造方法

总结

1、构造代码块用于给对象初始化,每次创建对象都会调用构造代码块,并且执行顺序在构造方法之前

2、静态代码块用于给类初始化,当类被加载的时候就会调用静态代码块(只执行一次),执行顺序在 main 方法之前