实例语句块/代码块和静态语句块/代码块

实例代码块

实例代码块写法

class Test {
	{
		System.out.println("语句块1");
	}
	{
		System.out.println("语句块2");
	}
	public static void main(String[] args) {
		Test test = new Test();
	}
}
  • 实例代码块可以编写多个,遵循自上而下的顺序依次执行
  • 实例代码块在构造函数调用前执行,构造方法执行一次,实例代码块也执行一次
  • 实例代码块也是Java语言为程序员准备的一个特殊时间,这个时机被称为“对象初始化”

静态代码块

class StaticTest {
	static {
		System.out.println("StaticTest类已被加载");
	}
	static {
		System.out.println("StaticTest类已被加载2");
	}
	public static void main(String[] args) {
		...
	}
}
  • 静态代码块在一个类中可以编写多个,同样遵循自上而下的执行顺序
  • 这部分的代码只在该类class文件加载进JVM方法区的时候执行一次。
  • 通常在类中完成预备工作,如初始化连接池、解析XML文件

实战

import lombok.Data;

@Data
public class Ingredient {
    static {
        System.out.println("静态代码块执行:");
        System.out.println("Ingredient类class文件已经加载!");
        System.out.println("静态代码中打印类静态变量:" + Ingredient.static_variable + "\n");
    }

    {
        System.out.println("实例代码块执行:");
        System.out.println("一个Ingredient对象实例化完成!");
        System.out.println("实例代码中打印类静态变量:" + Ingredient.static_variable);
        System.out.println("实例代码中打印当前对象成员变量:" + this.name);
    }

    private static String static_variable = "类的静态变量static_variable";
    private String id;
    private String name;
    private Type type;

    public static enum Type {
        WRAP, PROTEIN, VEGGIES, CHEESE, SAUCE
    }

    public Ingredient() {

    }

    public Ingredient(String id, String name, Type type) {
//        System.out.println(static_variable);
        this.id = id;
        this.name = name;
        this.type = type;
        System.out.println("构造方法中打印当前对象成员变量:" + this.name + "\n");
    }

    public static void main(String[] args) {
        Ingredient obj1 = new Ingredient("1", "obj1", Type.WRAP);
        Ingredient obj2 = new Ingredient("2", "obj2", Type.WRAP);
        Ingredient obj3 = new Ingredient("3", "obj3", Type.WRAP);

    }
}

输出结果

静态代码块执行:
Ingredient类class文件已经加载!
静态代码中打印类静态变量:null

实例代码块执行:
一个Ingredient对象实例化完成!
实例代码中打印类静态变量:类的静态变量static_variable
实例代码中打印当前对象成员变量:null
构造方法中打印当前对象成员变量:obj1

实例代码块执行:
一个Ingredient对象实例化完成!
实例代码中打印类静态变量:类的静态变量static_variable
实例代码中打印当前对象成员变量:null
构造方法中打印当前对象成员变量:obj2

实例代码块执行:
一个Ingredient对象实例化完成!
实例代码中打印类静态变量:类的静态变量static_variable
实例代码中打印当前对象成员变量:null
构造方法中打印当前对象成员变量:obj3


Process finished with exit code 0

总结

静态代码块什么时候执行?

当类class文件被加载进方法区(?)时,只执行一次

实例代码块什么时候执行?

当对象实例化时执行,实例化几次,就执行几次。

类静态变量是在什么时候被初始化的?

由以上代码可以看出,在类class文件被加载进方法去(?)后,类的静态变量并没有初始化,而实例对象完成创建后,类的静态变量初始化成功。

实例成员变量是在什么时候创建的?

由以上代码可以看出,在对象被创建之后,成员变量没有被创建,而实例的构造方法被调用后,该实例的成员变量被创建出来了

posted @ 2021-09-06 11:17  iiiiiiiivan  阅读(235)  评论(0)    收藏  举报