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
}