jvm四:常量的本质含义以及助记符基本认识

21 篇文章 0 订阅
package com.atChina.jvm;
/*
*  常量在编译阶段会存入到调用这个常量的方法所在的类的常量池中,
*  本质上,调用类并没有直接引用到定义常量的类,因此并不会触发
*  定义常量的类的初始化, 因此也就不会执行静态代码块的代码
*
*  如下代码: 常量f="刘备",存放到了Test2的常量池中,之后Test2与Father2就没有任何关系了
*  甚至,我们可以删除Father2的class文件
*
*  bipush表示将单字节(-128至127)的常量值推送至栈顶
*  sipush表示将一个短整形常量值(-32768至32767)推送至栈顶
*  iconst_1 表示将int类型1推送至栈顶( iconst_0至iconst_5分表表示整形0至5)
*/
public class Test2 {
    public static void main(String[] args) {
        System.out.println(Father2.f);
        System.out.println(Father2.s);
        System.out.println(Father2.i);
        System.out.println(Father2.ii);
        System.out.println(Father2.iii);
    }
}

class Father2{
    public static final String f = "刘备";// 被final修饰了,所以f是一个常量
    public static final short s = 127;
    public static final int i = 32767;
    public static final int ii = 1;
    public static final int iii = 5;
    static{
        System.out.println("桃园结义");
    }
}

通过javap -c 类路径.类名 就可以反编译class文件

   ldc助记符:

          表示将int,float或是String类型的常量值从常量池中推送至栈顶

   bipush助记符:

      表示将单字节(-128至127)的常量值推送至栈顶

   sipush助记符:

             表示将一个短整形常量值(-32768至32767)推送至栈顶

    iconst_1助记符:

              iconst_1 表示将int类型1推送至栈顶( iconst_0至iconst_5分表表示整形0至5)

javap -c com.atChina.jvm.Test2
Compiled from "Test2.java"
public class com.atChina.jvm.Test2 extends java.lang.Object{
public com.atChina.jvm.Test2();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

public static void main(java.lang.String[]);
  Code:
   0:   getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   3:   ldc     #4; //String 刘备
   5:   invokevirtual   #5; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   8:   getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   11:  bipush  127
   13:  invokevirtual   #6; //Method java/io/PrintStream.println:(I)V
   16:  getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   19:  sipush  32767
   22:  invokevirtual   #6; //Method java/io/PrintStream.println:(I)V
   25:  getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   28:  iconst_1
   29:  invokevirtual   #6; //Method java/io/PrintStream.println:(I)V
   32:  getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   35:  iconst_5
   36:  invokevirtual   #6; //Method java/io/PrintStream.println:(I)V
   39:  return

}

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值