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

对于数组实例来说,其类型是由JVM在运行期间动态生成的,表示为[Lcom....
其父类型都是Object

助记符:
anewarray 表示将引用类型的(如类、接口、数组) 数组,并将其引用值压入栈顶
newarray 表示将原始类型的(如int、float、char等) 数组,并将其引用值压入栈顶
package com.shengsiyuan.jvm.classloder;
/*
     对于数组实例来说,其类型是由JVM在运行期间动态生成的,表示为[Lcom....
     其父类型都是Object

     助记符:
     anewarray 表示将引用类型的(如类、接口、数组) 数组,并将其引用值压入栈顶
     newarray 表示将原始类型的(如int、float、char等) 数组,并将其引用值压入栈顶
 */
public class MyTest4 {
    public static void main(String[] args) {
        /*MyParent4 myParent4 = new MyParent4();//首次主动使用
        System.out.println("------");
        MyParent4 myParent5 = new MyParent4();
        //输出的结果是 静态代码块 ---- 没了。因为只有主动使用
        */
        MyParent4[] myParent4s=new MyParent4[1];//没有任何输出,并不是主动使用
        System.out.println(myParent4s.getClass());//class [Lcom.shengsiyuan.jvm.classloder.MyParent4;
        System.out.println(myParent4s.getClass().getSuperclass());//class java.lang.Object
        //这个是JVM在运行期生成出来的类型

        MyParent4[][] myParent4ss=new MyParent4[1][1];
        System.out.println(myParent4ss.getClass());//class [[Lcom.shengsiyuan.jvm.classloder.MyParent4;
        //会发现这次有两个左括号
        System.out.println(myParent4ss.getClass().getSuperclass());//class java.lang.Object
        System.out.println("------");
        int[] ints=new int[1];
        System.out.println(ints.getClass());
        System.out.println(ints.getClass().getSuperclass());

        char[] chars=new char[1];
        System.out.println(chars.getClass());

        boolean[] booleans=new boolean[1];
        System.out.println(booleans.getClass());

        short[] shorts=new short[1];
        System.out.println(shorts.getClass());

        byte[] bytes=new byte[1];
        System.out.println(bytes.getClass());



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

输出的结果为:

20:08:13: Executing task 'MyTest4.main()'...

> Task :compileJava
> Task :processResources NO-SOURCE
> Task :classes

> Task :MyTest4.main()
class [Lcom.shengsiyuan.jvm.classloder.MyParent4;
class java.lang.Object
class [[Lcom.shengsiyuan.jvm.classloder.MyParent4;
class java.lang.Object
------
class [I
class java.lang.Object
class [C
class [Z
class [S
class [B

BUILD SUCCESSFUL in 0s
2 actionable tasks: 2 executed
20:08:14: Task execution finished 'MyTest4.main()'.

对其进行追踪结果为:

D:\learning\jvm_lecture\build\classes\java\main\com\shengsiyuan\jvm\classloder>javap -c MyTest4
警告: 二进制文件MyTest4包含com.shengsiyuan.jvm.classloder.MyTest4
Compiled from "MyTest4.java"
public class com.shengsiyuan.jvm.classloder.MyTest4 {
  public com.shengsiyuan.jvm.classloder.MyTest4();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: iconst_1
       1: anewarray     #2                  // class com/shengsiyuan/jvm/classloder/MyParent4
       4: astore_1
       5: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
       8: aload_1
       9: invokevirtual #4                  // Method java/lang/Object.getClass:()Ljava/lang/Class;
      12: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
      15: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
      18: aload_1
      19: invokevirtual #4                  // Method java/lang/Object.getClass:()Ljava/lang/Class;
      22: invokevirtual #6                  // Method java/lang/Class.getSuperclass:()Ljava/lang/Class;
      25: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
      28: iconst_1
      29: iconst_1
      30: multianewarray #7,  2             // class "[[Lcom/shengsiyuan/jvm/classloder/MyParent4;"
      34: astore_2
      35: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
      38: aload_2
      39: invokevirtual #4                  // Method java/lang/Object.getClass:()Ljava/lang/Class;
      42: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
      45: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
      48: aload_2
      49: invokevirtual #4                  // Method java/lang/Object.getClass:()Ljava/lang/Class;
      52: invokevirtual #6                  // Method java/lang/Class.getSuperclass:()Ljava/lang/Class;
      55: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
      58: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
      61: ldc           #8                  // String ------
      63: invokevirtual #9                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      66: iconst_1
      67: newarray       int
      69: astore_3
      70: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
      73: aload_3
      74: invokevirtual #4                  // Method java/lang/Object.getClass:()Ljava/lang/Class;
      77: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
      80: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
      83: aload_3
      84: invokevirtual #4                  // Method java/lang/Object.getClass:()Ljava/lang/Class;
      87: invokevirtual #6                  // Method java/lang/Class.getSuperclass:()Ljava/lang/Class;
      90: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
      93: iconst_1
      94: newarray       char
      96: astore        4
      98: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
     101: aload         4
     103: invokevirtual #4                  // Method java/lang/Object.getClass:()Ljava/lang/Class;
     106: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
     109: iconst_1
     110: newarray       boolean
     112: astore        5
     114: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
     117: aload         5
     119: invokevirtual #4                  // Method java/lang/Object.getClass:()Ljava/lang/Class;
     122: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
     125: iconst_1
     126: newarray       short
     128: astore        6
     130: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
     133: aload         6
     135: invokevirtual #4                  // Method java/lang/Object.getClass:()Ljava/lang/Class;
     138: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
     141: iconst_1
     142: newarray       byte
     144: astore        7
     146: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
     149: aload         7
     151: invokevirtual #4                  // Method java/lang/Object.getClass:()Ljava/lang/Class;
     154: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
     157: return
}

 

记得跟踪一定是在classloder的目录下进行的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值