文章目录
  1. 1. 概述:阅读《深入理解JAVA虚拟机》第七章时的几个例子。
  2. 2. 代码:
  3. 3. 总结:

概述:阅读《深入理解JAVA虚拟机》第七章时的几个例子。

代码:

  • 引用数组的初始化
  • 常量的初始化
  • 子类父类静态字段的初始化
1
2
3
4
5
6
public class SuperClass {
static{
System.out.println("SuperClass被初始化了");
}
public static int value = 123;
}

1
2
3
4
5
6
7
public class SubClass extends SuperClass {

static {
System.out.println("SubClass 初始化了");
}

}

1
2
3
4
5
6
7
public class ConstClass {
static {
System.out.println("Const 被初始化了");
}
//常量在编译阶段会调入类的常量池中,本质上并没有直接引用到定义常量的类中,因此不会触发定义常量的类的初始化
public static final String HELLO_WORD = "hello word";
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//测试代码
public class Test {

public static void main(String[] args) {
//1.new一个类的数组时这个类不会被初始化
// SuperClass[] a = new SuperClass[12];
// System.out.println("1");

//2、编译期常量,类不会被初始化
// System.out.println(ConstClass.HELLO_WORD);

//3、通过子类来引用父类的静态字段只会触发父类的初始化
// System.out.println(SubClass.value);

}

}

总结:

  • 1、new一个类的数组时这个类不会被初始化
  • 2、编译期常量,类不会被初始化
  • 3、通过子类来引用父类的静态字段只会触发父类的初始化
文章目录
  1. 1. 概述:阅读《深入理解JAVA虚拟机》第七章时的几个例子。
  2. 2. 代码:
  3. 3. 总结: