class 文件中的程序的执行逻辑,java 文件中编写程序的逻辑。
JVM 对 class 文件的具体执行方式
1、写 Java 代码
public class Test {
public static void main (String args[]){
int i = 10;
int j = 20;
int k = i + j;
System.out.println(k);
}
}
2、编译成 class 字节码文件(16 进制,程序员根本看不懂)
![](https://img-blog.csdnimg.cn/20201025194734219.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkzMzQ1Ng==,size_16,color_FFFFFF,t_70#pic_center)
3、对 class 字节码进行反汇编,成为程序员能看懂的 JVM 指令
javap -c Test.java
结果:
Compiled from "Test.java"
public class Test {
public Test();
Code:
0: aload_0 //this当前对象入栈
1: invokespecial #1 // Method java/lang/Object."<init>":()V 要创建Test的构造器,首先创建父类Object的构造器
4: return //构造器的结束
public static void main(java.lang.String[]);
Code:
0: bipush 10 //把10压入操作数栈
2: istore_1 //把10从操作数栈取出来赋给变量i,并再次把i压入操作数栈
3: bipush 20 //把20压入操作数栈
5: istore_2 //把20从操作数栈取出来赋给变量j,并再次把j压入操作数栈
6: iload_1 //把赋过值的变量i从操作数栈中取出来
7: iload_2 //把赋过值的变量j从操作数栈中取出来
8: iadd //把加号从运算符栈取出来
9: istore_3 //把30从操作数栈取出来赋给变量k,并再次把k压入操作数栈
10: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
13: iload_3 //把赋过值的变量k从操作数栈中取出来,就可以用打印流打印出来了
14: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
17: return //方法的结束
}
总结:
简单来讲就是数据和运算符入栈出栈的过程,数据一般入的是操作数栈,运算符入的是运算符栈,这是计算机组成原理的知识。当有乘法和加法时,如果先入栈的是加法,不会先让两数相加,而是先乘,计算机是怎么做到的?计算机通过判断运算符的优先级,可以得知乘法的优先级高于加法,就会先让两个操作数相乘!