天下脸皮共十分
我占八分

类的初始化

发生的时机

概括地说,类的初始化是懒惰的

分以下几种情况

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"
赞(0) 打赏
未经允许不得转载:Stephen Young » 类的初始化
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏