发生的时机
概括地说,类的初始化是懒惰的
分以下几种情况
package tech.ityoung.study.demo.jvm;
public class ClassInitDemo {
static {
System.out.println("main init");
}
public static void main(String[] args) throws ClassNotFoundException {
// main方法所在的类总会被首先初始化
// 访问final静态常量(基本类型和字符串)不会初始化
System.out.println(B.b);
// 类对象.class不会初始化
System.out.println(B.class);
// 创建该类的数组不会引发初始化
System.out.println(new B[0]);
// 类加载器的loadClass方法
ClassLoader loader = ClassInitDemo.class.getClassLoader();
System.out.println(loader.loadClass("tech.ityoung.study.demo.jvm.B"));
// class.forName的参数2为false时不会初始化类
System.out.println(Class.forName("tech.ityoung.study.demo.jvm.B", false, loader));
// 首次访问类的静态变量或者静态方法会初始化
System.out.println("A.a = " + A.a);
// 子类初始化时,如果父类没有初始化会先初始化父类
System.out.println("B.c = " + B.c);
// Class.forName
System.out.println(Class.forName("tech.ityoung.study.demo.jvm.B"));
// 创建对象
System.out.println(new B());
}
}
class A {
static int a = 0;
static {
System.out.println("class a init");
}
}
class B extends A {
final static double b = 5.0;
static boolean c = false;
static {
System.out.println("class b init");
}
}
final静态常亮类型为包装类型,则会引发初始化
E:\Java\studyDemo\target\classes\tech\ityoung\study\demo\jvm>javap -v B.class
Classfile /E:/Java/studyDemo/target/classes/tech/ityoung/study/demo/jvm/B.class
Last modified 2020年12月8日; size 727 bytes
MD5 checksum 0b9c7642c8f376939f0b0a416026aa7d
Compiled from "ClassInitDemo.java"
class tech.ityoung.study.demo.jvm.B extends tech.ityoung.study.demo.jvm.A
minor version: 0
major version: 52
flags: (0x0020) ACC_SUPER
this_class: #8 // tech/ityoung/study/demo/jvm/B
super_class: #9 // tech/ityoung/study/demo/jvm/A
interfaces: 0, fields: 3, methods: 2, attributes: 1
Constant pool:
#1 = Methodref #9.#29 // tech/ityoung/study/demo/jvm/A."<init>":()V
#2 = Fieldref #8.#30 // tech/ityoung/study/demo/jvm/B.c:Z
#3 = Methodref #31.#32 // java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
#4 = Fieldref #8.#33 // tech/ityoung/study/demo/jvm/B.d:Ljava/lang/Integer;
#5 = Fieldref #34.#35 // java/lang/System.out:Ljava/io/PrintStream;
#6 = String #36 // class b init
#7 = Methodref #37.#38 // java/io/PrintStream.println:(Ljava/lang/String;)V
#8 = Class #39 // tech/ityoung/study/demo/jvm/B
#9 = Class #40 // tech/ityoung/study/demo/jvm/A
#10 = Utf8 b
#11 = Utf8 D
#12 = Utf8 ConstantValue
#13 = Double 5.0d
#15 = Utf8 c
#16 = Utf8 Z
#17 = Utf8 d
#18 = Utf8 Ljava/lang/Integer;
#19 = Utf8 <init>
#20 = Utf8 ()V
#21 = Utf8 Code
#22 = Utf8 LineNumberTable
#23 = Utf8 LocalVariableTable
#24 = Utf8 this
#25 = Utf8 Ltech/ityoung/study/demo/jvm/B;
#26 = Utf8 <clinit>
#27 = Utf8 SourceFile
#28 = Utf8 ClassInitDemo.java
#29 = NameAndType #19:#20 // "<init>":()V
#30 = NameAndType #15:#16 // c:Z
#31 = Class #41 // java/lang/Integer
#32 = NameAndType #42:#43 // valueOf:(I)Ljava/lang/Integer;
#33 = NameAndType #17:#18 // d:Ljava/lang/Integer;
#34 = Class #44 // java/lang/System
#35 = NameAndType #45:#46 // out:Ljava/io/PrintStream;
#36 = Utf8 class b init
#37 = Class #47 // java/io/PrintStream
#38 = NameAndType #48:#49 // println:(Ljava/lang/String;)V
#39 = Utf8 tech/ityoung/study/demo/jvm/B
#40 = Utf8 tech/ityoung/study/demo/jvm/A
#41 = Utf8 java/lang/Integer
#42 = Utf8 valueOf
#43 = Utf8 (I)Ljava/lang/Integer;
#44 = Utf8 java/lang/System
#45 = Utf8 out
#46 = Utf8 Ljava/io/PrintStream;
#47 = Utf8 java/io/PrintStream
#48 = Utf8 println
#49 = Utf8 (Ljava/lang/String;)V
{
static final double b;
descriptor: D
flags: (0x0018) ACC_STATIC, ACC_FINAL
ConstantValue: double 5.0d
static boolean c;
descriptor: Z
flags: (0x0008) ACC_STATIC
static final java.lang.Integer d;
descriptor: Ljava/lang/Integer;
flags: (0x0018) ACC_STATIC, ACC_FINAL
tech.ityoung.study.demo.jvm.B();
descriptor: ()V
flags: (0x0000)
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #1 // Method tech/ityoung/study/demo/jvm/A."<init>":()V
4: return
LineNumberTable:
line 43: 0
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Ltech/ityoung/study/demo/jvm/B;
static {};
descriptor: ()V
flags: (0x0008) ACC_STATIC
Code:
stack=2, locals=0, args_size=0
0: iconst_0
1: putstatic #2 // Field c:Z
4: bipush 20
6: invokestatic #3 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
9: putstatic #4 // Field d:Ljava/lang/Integer;
12: getstatic #5 // Field java/lang/System.out:Ljava/io/PrintStream;
15: ldc #6 // String class b init
17: invokevirtual #7 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
20: return
LineNumberTable:
line 45: 0
line 46: 4
line 49: 12
line 50: 20
}
SourceFile: "ClassInitDemo.java"
评论前必须登录!
注册