* 编译时使用`javac`指令,将源码编译生成字节码,并存入到对应的`.class`文件中。
```java
package javabasic;
public class ByteCodeSample {
public static void main(String[] args) {
int i = 1, j = 5;
i++;
++j;
System.out.println(i);
System.out.println(j);
}
}
```
使用`javac ByteCodeSample.java` 编译生成`ByteCodeSample.class`文件,使用`javap -c ByteCodeSample.class`对字节码进行反汇编,查看字节码内容。
```java
Compiled from "ByteCodeSample.java"
public class javabasic.ByteCodeSample {
public javabasic.ByteCodeSample();
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放到栈顶
1: istore_1 //将栈顶的值放到局部变量1中
2: iconst_5 //将常量2放到栈顶
3: istore_2 //将栈顶的值放到局部变量2中
4: iinc 1, 1 //将变量1加1
7: iinc 2, 1 //将变量2加1
10: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
13: iload_1
14: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
17: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
20: iload_2
21: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
24: return
}
```
![](https://github.com/xmisaka/JavaOffer/raw/master/Documents/imgs/java%E5%B9%B3%E5%8F%B0%E6%97%A0%E5%85%B3%E6%80%A7.png)
* 运行时`.class`文件是跨平台的基础,`Java`源码首先被编译成字节码,再由不同平台的`JVM`进行解析,
`Java`语言在不同的平台运行时不需要重新进行编译,`Java`虚拟机在执行字节码的时候,把字节码解释成具体平台上的机器指令。
> Q:为什么`JVM`不直接将源码解析成机器码去执行
> A:每次执行的时候都需要进行各种语法、句法、语义的检查,即每次执行的时候这些分析的结果都不会保存下来,
> 要重新进行编译,重新去分析,这样整体的性能就会受到影响。同时,也可以脱离`Java`的束缚,将别的语言解析成字节码,同样能被`JVM`执行。