Java—代码块详解

Posted 一朵花花

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java—代码块详解相关的知识,希望对你有一定的参考价值。

代码块概念

在java中,{ } 括起来的代码被称为代码块

代码块分类

普通代码块

类中方法的方法体

public class Main{
	public static void main(String[] args) {
		{ 
		  ...普通代码块
		 }
	}
}

普通代码块使用不多,这里不过多讲解

构造代码块

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

public class Person {
    String name;
    String sex;
    int age;
	
	{  //构造代码块
        name = "花花";
        sex = "女";
        age = 3;
    }
 }

构造代码块会在创建对象时被调用,每次创建时都会被调用,优先于类构造函数执行

验证:

public class Person {
    String name;
    String sex;
    int age;

    {
        this.name = "花花";
        this.sex = "女";
        this.age = 3;
    }

    public static void main(String[] args) {
        Person person1 = new Person();
        Person person2 = new Person();
        Person person3 = new Person();
    }
}

打断点调试代码,你会发现:person对象均被初始化


使用打印再次验证:

    {
        this.name = "花花";
        this.sex = "女";
        this.age = 3;
        System.out.println("我是实例代码块!!");
    }


提供构造方法:

 public Person() {
     System.out.println("我是构造方法!!!");
 }

输出结果:

以上验证了 构造代码块会在创建对象时被调用,每次创建时都会被调用,优先于类构造函数执行

JVM层面理解:


编译器在编译代码时,会将实例代码块中的内容拷贝到构造方法第一条语句前

多个实例代码块最终会按照定义的先后顺序合并成一份,并将其拷贝到每个构造方法中
验证:

public class Demo {
    int a;
    {
        a = 10;
        System.out.println("实例代码块1");
    }
    {

        System.out.println("实例代码块2");
    }

    public static void main(String[] args) {
        Demo demo = new Demo();
    }
}

就地初始化

//就地初始化
public class Person {
    String name = "嗯哼";
    String sex = "Unknown";
    int age = 0;

//
    { //实例代码块
        this.name = "花花";
        this.sex = "女";
        this.age = 3;
        System.out.println("我是实例代码块!!");
    }
    //构造方法
    public Person(){
        System.out.println("我是构造方法!!!");
    }

    public static void main(String[] args) {
        Person person1 = new Person();
        Person person2 = new Person();
        Person person3 = new Person();
    }
}

JVM层面理解:


编译期间,编译器会将就地初始化的内容拷贝到构造方法中,且拷贝在实例代码块之前

静态代码块

用 static{ } 包裹起来的代码片段
只会执行一次,静态代码块优先于构造代码块执行,一般用于初始化静态成员变量

//静态代码块
static {
    System.out.println(money);
    money = 100;
    System.out.println(money);
    System.out.println("我是静态代码块!!!");
}

输出结果:


打断点,看调试过程:

静态代码块在类加载时只执行一次

在类加载阶段执行,在编译阶段时,编译器会将多个静态代码块按照定义的先后次序依次合并,最终放在生成的方法中

验证:

public class Demo {
    static int b;
    static {
        b = 20;
        System.out.println("静态代码块1");
    }
    static {
        System.out.println("静态代码块2");
    }
    public static void main(String[] args) {
        Demo demo = new Demo();
    }
}

总结:

  • 静态代码块不管生成多少个对象,其只会执行一次
  • 静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的
  • Java代码在经过编译器编译之后,如果要运行必须先要经过类加载子系统加载到JVM中才能运行
  • 如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次合并,最终放在生成的<>方法中,该方法在类加载时调用,并且只调用一次

补充:

javac:
用纯 Java 语言编写的一个编译器
.
按照 Java 语言的语法对源文件进行检测,是否违反语法规范
若不符合Java语法规范,则编译失败—报错;
若符合,则按照字节码文件规范生成相对应的字节码文件

编译过程:简单了解Java编译原理

同步代码块

(后面再来进行补充~~)

以上是关于Java—代码块详解的主要内容,如果未能解决你的问题,请参考以下文章

Java面向对象 类的成员之代码块的详解

java中静态代码块的用法 static用法详解和static静态导入

“全栈2019”Java异常第四章:catch代码块作用域详解

java中静态代码块的用法—— static用法详解

java中静态代码块的用法 static用法详解

JAVA多线程synchronized详解