* 編譯時使用`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
}
```

* 運行時`.class`文件是跨平臺的基礎,`Java`源碼首先被編譯成字節碼,再由不同平臺的`JVM`進行解析,
`Java`語言在不同的平臺運行時不需要重新進行編譯,`Java`虛擬機在執行字節碼的時候,把字節碼解釋成具體平臺上的機器指令。
> Q:為什么`JVM`不直接將源碼解析成機器碼去執行
> A:每次執行的時候都需要進行各種語法、句法、語義的檢查,即每次執行的時候這些分析的結果都不會保存下來,
> 要重新進行編譯,重新去分析,這樣整體的性能就會受到影響。同時,也可以脫離`Java`的束縛,將別的語言解析成字節碼,同樣能被`JVM`執行。