詳細分析從編譯到執行到輸出結果的過程:
public class HelloWorld {
public static void main(String[] args)
{
String s ;
s = “Hello World!”; //定義字符串s
System.out.println(s);
}
}
HelloWorld的具體執行過程:
1 先通過編譯器(javac)編譯HelloWorld.java文件,找到主類HelloWorld裏面有多少個類(多個類中只有一個類可以被public修飾)就編譯成多少個.class字節碼文件
2.然後通過虛擬機(JVM)解釋含有主函數的.class文件(HelloWorld.class)。通過main()方法獲得程序的入口,此時通過三個允許(static靜態綁定類,用public確定方法,再用void確定不處理返回值)纔可以進入並執行該程序。
3.主方法在內存的棧區的開闢工作空間,開始main方法的時候會到標準類庫調用String[] ,String , System標準字節輸入輸出流,Object等這幾個類的字節碼文件加載到方法區的類代碼段中。
4.在堆區創建一個空(String[ ])數組對象從棧區把args傳過來到堆的空數組對象String[ ]中。
5.因爲String s 是成員變量所以在主方法的工作區間創建String類型的 s 變量。
6.定義了一個”Hello world !”常量對象存放在方法區的常量值數據區並且會創建相應的toString()方法,棧區的s變量指向了 這個方法區的常量。
7.最後執行輸出語句輸出其實是s的地址,但是s指向(存儲)的是“Hello world !”常對象的地址,而且該常對象覆蓋重寫了父類的toString()方法,所以最後輸出的結果是:Hello world !
PS: 虛擬機調用主方法時會創建三個默認對象:System.out(標準字節輸出流對象)、System.in(標準字節輸入流對象)和System.error(標準字節出錯流對象).
以上共涉及:
1個java文件:HelloWorld.java
4個class類: HelloWorld.class、String[].class、String.class、System.class
5個對象: “Hello World!”、String[]、System.out、System.in、System.error
2個變量:args、s
3個方法:main()、toString()、println()