实例语句块/代码块和静态语句块/代码块
实例代码块
实例代码块写法
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文件被加载进方法去(?)后,类的静态变量并没有初始化,而实例对象完成创建后,类的静态变量初始化成功。
实例成员变量是在什么时候创建的?
由以上代码可以看出,在对象被创建之后,成员变量没有被创建,而实例的构造方法被调用后,该实例的成员变量被创建出来了

浙公网安备 33010602011771号