美文网首页
类的被动使用

类的被动使用

作者: Shaw_Young | 来源:发表于2021-09-27 17:13 被阅读0次
/**
 * 关于类的被动使用,即不会进行类的初始化操作,即不会调用<clinit>()
 * <p>
 * 1.当访问一个静态字段时,只有真正声明这个字段的类才会被初始化。
 * - 当通过子类引用父类的静态变量,不会导致子类初始化
 * 2.通过数组定义类引用,不会触发此类的初始化
 *
 * 说明:没有初始化的类,不意味着没有加载!
 */
public class PassiveUse1 {
    @Test
    public void test1() {
        System.out.println(Child.num);
    }
    @Test
    public void test2() {
        Parent[] parents = new Parent[10];
    }
}

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

    public static int num = 1;
}

class Child extends Parent {
    static {
        System.out.println("Child的初始化过程");
    }
}
/**
 * 3.引用常量不会触发此类或接口的初始化。因为常量在链接阶段就已经被显示赋值了。
 * 4.调用ClassLoader类的loadClass()方法加载一个类,并不是对类的主动使用,不会导致类的初始化。
 */
public class PassiveUse2 {
    @Test
    public void test1(){
        System.out.println(Person.NUM);
    }
    @Test
    public void test2(){
//        System.out.println(SerialA.ID);
        System.out.println(SerialA.ID1);
    }
    @Test
    public void test3(){
        try {
            Class clazz = ClassLoader.getSystemClassLoader().loadClass("com.young.springbootdemo.jvm.Person");

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

class Person{
    static {
        System.out.println("Person类的初始化");
    }
    public static final int NUM = 1;//在链接过程的准备环节就被赋值为1了
    public static final int NUM1 = new Random().nextInt(10);
}

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

    int ID = 1;
    int ID1 = new Random().nextInt(10);//此时的赋值操作需要在<clinit>()中执行
}

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

相关文章

网友评论

      本文标题:类的被动使用

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