美文网首页
类加载时机

类加载时机

作者: 紫色红色黑色 | 来源:发表于2019-12-24 10:50 被阅读0次

面试题

public class A {

    static {
        System.out.println("static a");
    }

    {
        System.out.println("block a");
    }

    public static String name = "hello";
    public static final String WORLD = "world";

    public A() {
        System.out.println("construct a");
    }
}


public class B extends A {

    static {
        System.out.println("static b");
    }

    {
        System.out.println("block b");
    }

    public B() {
        System.out.println("construct b");
    }
}


public class ClassLoadingDemo {

    public static void main(String[] args) {

        B b = new B();
        B b2 = new B();
    }
}

输出结果

static a
static b
block a
construct a
block b
construct b
block a
construct a
block b
construct b

从结果可以看到:
1.类初始化发生在对象初始化之前;
2.类初始化只发生一次;
3.父类初始化先于子类初始化;
4.静态代码块>代码块>构造方法;

类加载时机

下面内容引用自《深入理解Java虚拟机》

主动引用

虚拟机规范规定有且只有5种情况必须对类进行初始化:
1.遇到new、getstatic、putstatic、invokestatic四个字节码指令时。对应的java场景是:new对象时、读取或设置类变量(被final修饰的常量除外)时、调用类的静态方法时。
2.java.lang.reflect包的方法对类进行反射调用时
3.初始化类时,发现其父类没有初始化,则先初始化父类
4.虚拟机启动时指定的main()所在的类,虚拟机先初始化该类
5.如果java.lang.invoke.MethodHandle实例最后解析的结果REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄。并且这个方法句柄所对应的类没有初始化时,则先触发初始化。

被动引用

1.通过子类引用父类的静态字段,不会触发子类初始化
代码以上述为基础

public static void main(String[] args) {
    System.out.println(B.name);
}

显示,jvm参数加上-XX:+TraceClassLoading查看加载的类,可以看到B也加载了。

static a
hello

2.通过数组来引用类,不会触发此类的初始化
下面代码可以加载A,但是不初始化类

public static void main(String[] args) {
    A[] a = new A[10];
}

3.常量在编译阶段会存入调用类的常量池中,本质上并没有直接引用到定义常量的类,因此不会触发定义常量的类的初始化

public static void main(String[] args) {
    System.out.println(A.WORLD);
}

显示

world

相关文章

  • 深入理解jvm类加载机制

    1.什么是类加载? 类加载机制一个很大的体系,包括类加载的时机,类加载器,类加载时机。 1.1类加载过程 加载器加...

  • 技术文章收集

    单例模式Java 类加载静态类加载时机

  • 类加载时机

  • 类加载时机

    面试题 输出结果 从结果可以看到:1.类初始化发生在对象初始化之前;2.类初始化只发生一次;3.父类初始化先于子类...

  • 虚拟机类加载机制

    虚拟机类加载机制 @(Java虚拟机)[类加载] [TOC] 类加载时机 类加载到卸载的生命周期包括: 加载(Lo...

  • Java类加载机制和对象创建过程

    Java类加载机制和对象创建过程 1、类加载 类加载的时机 ​ 类加载,即虚拟机加载.class文件。什么时候虚拟...

  • 虚拟机类加载机制

    1、类加载时机 类生命周期 加载(loading)、验证(Verification)、准备(preparation...

  • 6.虚拟机类加载机制及类加载器

    虚拟机类加载机制及类加载器 1. 类加载的时机 类的整个生命周期包括:加载(Loading)、验证(Verific...

  • 8

    1. JVM中加载类的时机具体举例?以及双亲委派加载的机制是什么? (1)JVM中加载类的时机具体举例: 1)使用...

  • 【JVM】类加载机制

    一 类加载的时机 加载(Loading)、验证(Verification)、准备(Preparation)、解析(...

网友评论

      本文标题:类加载时机

      本文链接:https://www.haomeiwen.com/subject/amuxoctx.html