03.编译期常量与运行期常量的区别与数组创建本质分析

 

编译期常量

当一个常量的值并非编译期间可以确定的,那么其值就不会放到调用类的常量池中

这时在程序运行时,会主动使用这个常量所在的类,显然会导致这个类会被初始化,输出静态代码块中语句

public class MyTest3 {
    public static void main(String[] args) {
        System.out.println(MyParent3.str);
    }
}

class MyParent3 {
    public static final String str = UUID.randomUUID().toString();

    static {
        System.out.println("MyParent3 static code");
    }
}

运行期常量

new 对象时,对类的首次主动使用,以下语句会被输出

public class MyTest {
    public static void main(String[] args) {
        MyParent4 myParent4 = new MyParent4();
        MyParent4 myParent42 = new MyParent4();
    }
}

class MyParent4 {
    static {
        System.out.println("MyParent4 static block");
    }
}

数组创建的本质

对数组实例来说,其实例是由 JVM 在运行期动态生成的,表示为

[Lcn.duniqb.jvm.classloader.MyParent4

动态生成的类型,其父类型就是 Object

对于数组来说,JavaDoc 经常将构成数组元素为 Component,实际上就是将数组降低一个维度的类型

语句不会被输出

public class MyTest4 {
    public static void main(String[] args) {
        MyParent4[] myParent42 = new MyParent4[1];
        System.out.println(myParent42.getClass());

        MyParent4[][] myParent421 = new MyParent4[1][1];
        System.out.println(myParent421.getClass());

        System.out.println(myParent42.getClass().getSuperclass());
        System.out.println(myParent421.getClass().getSuperclass());
    }
}

class MyParent4 {
    static {
        System.out.println("MyParent4 static block");
    }
}

助记符

  • anewarray
    • 表示创建一个引用类型的 (如类,接口,数组) 数组,并将其压入栈顶
  • newarray
    • 表示创建一个指定的原始类型 (如int,float,char等) 的数组,并将其引用值压入栈顶

posted @ 2019-06-10 22:58  duniqb  阅读(136)  评论(0编辑  收藏  举报