Javaの代码块

183 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

接着上篇博客,我提到了如何用静态代码块来进行static成员变量初始化
那么这篇文章我会给大家介绍一下代码块到底是个什么块(hhh)

1.🍟代码块概念以及分类

使用{}定义的一段代码称为代码块。根据代码块定义的位置以及关键字,又可以分为以下四种:

  • 普通代码块
  • 构造(实例)代码块
  • 静态代码块
  • 同步代码块(涉及到多线程部分的知识,后面再解释)

2.🌍普通代码块

普通代码块:定义在方法中的代码块
首先我们看下面这一段代码

/**
 * Created with IntelliJ IDEA.
 * Description: Hello,I would appreciate your comments~
 * User:
 * Date: -04-03
 * Destination:普通块代码块
 */
public class TestDemo1 {
    public static void main(String[] args) {
        {//普通代码块直接用{}定义,
            int x =10;
            System.out.println("x1 = "+x);
        }
        int x = 200;
        System.out.println("x2 = "+x);
        {
            int y = 300;
            System.out.println("y = "+y);
        }
    }
}

这里的输出为:

x1 = 10 x2 = 200 y = 300

我们可以发现这里的执行顺序就是按照正常从上往下的。
但是,我们把这里的第二个代码块中的y换成x试一试

public class TestDemo1 {
    public static void main(String[] args) {
        {//普通代码块直接用{}定义,
            int x =10;
            System.out.println("x1 = "+x);
        }
        int x = 200;
        System.out.println("x2 = "+x);
        {
            int x = 300;
            System.out.println("x = "+x);
        }
    }
}

image.png
我们发现就会报错,所以同一个方法中的不同普通代码块还是有联系的

3.🍰构造(实例)代码块

构造块:定义在类中的代码块(不加修饰)。也叫:实例代码块。
构造代码块一般用于初始化实例成员变量

/**
 * Created with IntelliJ IDEA.
 * Description: Hello,I would appreciate your comments~
 * User:
 * Date: -04-03
 * Destination:实例代码块
 */
public class Student {
    private String name;
    private String gender;
    private int age;
    private double score;

//    构造函数
    public Student(){
        System.out.println("Student的构造函数被执行了!");
    }

//    实例代码块
    {
        this.name = "Bonnie";
        this.age = 19;
        this.gender = "女";
        System.out.println("实例代码块初始化了!");
    }

    public void show(){
        System.out.println("name:"+name+"age:"+age+"gender:"+gender);
    }


    public static void main(String[] args) {
        Student s1 = new Student();
        s1.show();
    }
}

输出结果如下👇
image.png
实例代码块,通过字面意思我们就可以知道它是我们在实例化对象的时候才会去调用的代码块
[注意事项]
实例代码块一般都是优先于构造方法执行的。因为编译完成之后,编译器会将实例代码块中的代码拷贝到每个构造方法第一条语句前
我们从字节码角度来看,其实就是拷贝一下实例代码块到构造方法之前。
实例代码块一般用来初始化实例出的对象的普通的成员变量

4.🍦静态代码块

使用static定义的代码块称为静态代码块。
一般用来初始化静态成员变量

public class Student {
    private String name;
    private String gender;
    private int age;
    private double score;
    private static String classRoom;

//    构造函数
    public Student(){
        System.out.println("Student的构造函数被执行了!");
    }

//    实例代码块
    {
        this.name = "Bonnie";
        this.age = 19;
        this.gender = "女";
        System.out.println("实例代码块初始化了!");
    }

//    静态代码块
    static {
        classRoom = "三年二班";
        System.out.println("静态代码块被调用了!");
    }

    public static void main(String[] args) {
        Student s1 = new Student();
        Student s2 = new Student();
        System.out.println(Student.classRoom);
    }
}

输出结果如下👇
image.png
我们可以看到,静态代码块是优先于其他而执行的,而且整个过程中只执行一次
[注意事项]

  • 静态代码块和实例化的对象没有关系,在整个程序中只会执行一次
  • 静态成员变量是类的属性,所以是在JVM加载类的时候开辟空间并同时初始化的
  • Java代码在讲过编译器编译之后,如果要运行必须要先经过类加载子系统加载到JVM中再能运行

image.png
在链接阶段第二步准备中会给静态成员变量开辟空间,并设置为默认值,在初始化阶段,会执行静态代码块中的代码.

  • 如果一个类中包含多个静态代码块,在编译代码的时候,编译器会按照定义的先后次序依次进行合并,最终放在生成的<>方法中,该方法在类加载时调用,并且只调用一次
  • 实例代码块只有在创建对象的时候才会执行

代码块就到这里咯,希望能帮到你~
感谢阅读!