美文网首页
类的主动使用3

类的主动使用3

作者: Shaw_Young | 来源:发表于2021-09-26 10:11 被阅读0次

如果针对代码,设置参数-XX:+TraceClassLoading,可以追踪类的加载信息并打印出来。

/*
 * 4.当使用java.lang.reflect包中的方法反射类的方法时。比如:Class.forName("com.young.java.Test")
 * 5.当初始化子类时,如果发现其父类还没有进行过初始化,则需要先触发父类的初始化。
 * 6.如果一个接口定义了default方法,那么直接实现或者间接实现该接口的类的初始化,该接口要在其之前被初始化。
 * 7.当虚拟机启动时,用户需要指定一个要执行的主类(包含main()方法的那个类),虚拟机会先初始化这个类。
 * 8.当初次调用 MethodHandle 实例时,初始化该 MethodHandle 指向的方法所在类。(涉及解析REF_getStatic、REF_putStatic、REF_invokeStatic方法句柄对应的类)
 *
 *
 *针对5,补充说明:
 *当Java虚拟机初始化一个类时,要求它的所有父类都已经被初始化,但是这条规则不适用于接口。
 *在初始化一个类时,并不会先初始化它所实现的接口
 *在初始化一个接口时,并不会先初始化它的父接口
 *因此,一个父接口并不会因为它的子接口或者实现类的初始化而初始化。只有当程序首次使用特定接口的静态字段时,才不会导致该接口的初始化。
 */
public class ActiveUser3 {

    @Test
    public void test1() throws ClassNotFoundException {
        Class clazz = Class.forName("com.young.springbootdemo.jvm.Order");
    }

    @Test
    public void test2() {
        System.out.println(Son.num);
    }

    @Test
    public void test3(){
        System.out.println(CompareC.NUM1);
    }
}

class Father {
    static {
        System.out.println("Father类的初始化过程");
    }
}

class Son extends Father implements CompareB {
    static {
        System.out.println("Son类的初始化过程");
    }

    public static int num = 1;
}

interface CompareB  {
    public static final Thread t = new Thread() {
        {
            System.out.println("CompareB的初始化");
        }
    };

    default void method1(){
        System.out.println("你好!");
    }
}

interface CompareC extends CompareB {
    public static final Thread t = new Thread() {
        {
            System.out.println("CompareC的初始化");
        }
    };

    public static final int NUM1 = new Random().nextInt();
}

梦想很模糊,去追,它会渐变清晰。青春励志,奋斗下去别放弃。

相关文章

网友评论

      本文标题:类的主动使用3

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