JVM学习笔记7——编译期常量与运行常量的区别及数组创建本质分析

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");
    }

}

当str是一个随机数,会输出静态代码块与不同的随机数,上一节str='hello world' 就不会执行static代码块

这时因为,当一个常量的值并非编译期间可以确定的,那么其值就不会被放到调用类的常量池中,这时在程序运行时,会导致主动使用这个常量所在的类,显然会导致这个类被初始化。

public class MyTest4 {

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

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

会输出MyParent4 static block 符合首次主动使用

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

只会输出一次,因为只有首次主动使用才会初始化

public class MyTest4 {

    public static void main(String[] args) {
        // MyParent4 myParent4 = new MyParent4();
        // MyParent4 myParent5 = new MyParent4();
        MyParent4[] myParent5 = new MyParent4[1];
    }

}

class MyParent4{

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

}

什么都不输出,new MyParent4[1] 肯定是生成了实例,使用getClass查看从属类型

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

[L开头的对象是由JAVA虚拟机在运行期创建出来的

对于引用类型的数组实例来说,其类型是由JVM运行期动态生成的,表示为[L....,这种形式。动态生成的类型,其父类型就是Object(原始类型的每个基本都不太一样,如int[] 是 [I 等)

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

助记符:

anewarray:表示创建一个引用类型的(如类,接口,数组)数组,并将其引用值压入栈顶

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

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值