對於筆記3中的HelloWorld程序,編譯時只要輸入javac HelloWorld.java即可生成類文件;再用java HelloWorld即可運行。
如果源程序使用了包聲明,編譯運行時要使用某些參數才能成功編譯或運行。下面用簡單的例子說明一下。
作者: 蟬蟬
請尊重作者勞動成果,轉載請在標題注明“轉載”字樣,並標明原文鏈接:
http://www.cnblogs.com/chanchan/p/7613261.html
有兩個源文件,分別為StringCompareEmp.java和StringFunction.java,兩個源文件都有包聲明語句"package StringTest;",即它們同屬StringTest包,編譯生成的類文件要放到StringTest文件夾下。具體代碼如下:
注:包名最好小寫…

/* * compareTo()返回參與比較的兩個字符串的ascii碼差值 * Object類.... */ package StringTest; public class StringCompareEmp{ public void printCompare() { // public static void main(String[] args) { int indexI = 3; String firststr = "This String"; String secondstr = "this string"; Object objstr = firststr; String str1 = "a"; String str2 = "b"; String str3 = "abc"; String str4 = "ab"; String str5 = "abcde"; String str6 = "a"; System.out.println( firststr + " 第" + (indexI+1) + "個字符是:" + firststr.charAt(indexI) );//char charAt(int) System.out.println( firststr + " 與 " + secondstr + " 按字典順序比較,結果為:" + firststr.compareTo(secondstr) );//int compareTo(String),按字典順序比較兩個字符串 System.out.println( firststr + " 與 " + secondstr + " 按字典順序比較並且不考慮大小寫,結果為:" + firststr.compareToIgnoreCase(secondstr) );//int compareToIgnoreCase(String),按字典順序比較兩個字符串,不考慮大小寫 System.out.println( firststr + " 與 " + objstr + " 比較,結果為:" + firststr.compareTo(objstr.toString()) );//int compareTo(Object),把字符串與另一個對象比較 // 兩個字符串首字母不同,則返回首字母的ascii差值 System.out.println( "兩個字符串首字母不同,則返回首字母的ascii差值:" ); System.out.println( str1 + " 與 " + str2 + " 按字典順序比較,結果為: " + str1.compareTo(str2) ); System.out.println( str4 + " 與 " + str2 + " 按字典順序比較,結果為: " + str4.compareTo(str2) ); System.out.println( str5 + " 與 " + str2 + " 按字典順序比較,結果為: " + str5.compareTo(str2) ); //首字母相同,則比較下一個字符,直到有不同的為止或比較到字符串最后一個字符,返回該不同的字符的ascii差值;如果兩字符串長度不同,可以參與比較的字符又完全一樣,返回兩個字符串的長度差值 System.out.println( "首字母相同,則比較下一個字符,直到有不同的為止或比較到字符串最后一個字符,返回該不同的字符的ascii差值;如果兩字符串長度不同,可以參與比較的字符又完全一樣,返回兩個字符串的長度差值:" ); System.out.println( str4 + " 與 " + str1 + " 按字典順序比較,結果為: " + str4.compareTo(str1) ); System.out.println( str1 + " 與 " + str6 + " 按字典順序比較,結果為: " + str1.compareTo(str6) ); System.out.println( str3 + " 與 " + str1 + " 按字典順序比較,結果為: " + str3.compareTo(str1) ); System.out.println( str3 + " 與 " + str4 + " 按字典順序比較,結果為: " + str3.compareTo(str4) ); System.out.println( str5 + " 與 " + str1 + " 按字典順序比較,結果為: " + str5.compareTo(str1) ); System.out.println( str5 + " 與 " + str4 + " 按字典順序比較,結果為: " + str5.compareTo(str4) ); System.out.println( str5 + " 與 " + str3 + " 按字典順序比較,結果為: " + str5.compareTo(str3) ); System.out.println( str3 + " 與 " + str5 + " 按字典順序比較,結果為: " + str3.compareTo(str5) ); } }

package StringTest; public class StringFunction{ public static void main(String[] args) { // StringCompareEmp strcmp = new StringCompareEmp(); // SearchLastString secstr = new SearchLastString(); // strcmp.printCompare(); // secstr.printSearch(); System.out.println("function"); } }
1,在windows系統下打開命令行,進入到源文件所在目錄
①,編譯StringCompareEmp. java,輸入javac -d . StringCompareEmp. java,這里用到參數"-d .",表示在當前目錄下生成包文件夾,並把類文件放到該文件夾下;不加-d參數的話,在當前目錄下能生成類文件,但運行時會提示找不到或無法加載類文件,原因在於,JVM要到包文件夾下尋找類文件,而此時只在當前目錄下有類文件,這樣就會出錯。
命令如圖1所示:
圖1
出現“編碼GBK的不可映射字符”的錯誤,原因是,系統默認的編碼格式與源文件編碼格式不同,編譯時沒有顯式指定源文件編碼格式的話,JDK會把源文件從系統默認編碼格式轉換為Java默認編碼格式,這樣就出現亂碼了。
圖2
②,編譯時加上參數“-encoding UTF-8”就能正確編譯了。
圖3
編譯通過后,查看目錄,發現當前目錄下生成StringTest文件夾,StringCompareEmp. class文件就放在該文件夾下。
圖4
③,用同樣的命令編譯StringFunction. java
圖5
查看StringTest文件夾,兩個類文件都存放其中。
圖6
④,用命令java StringTest. StringFunction執行類文件,成功輸出
圖7
2,更改源程序StringFunction. java,修改后的源文件如下:

package StringTest; public class StringFunction{ public static void main(String[] args) { StringCompareEmp strcmp = new StringCompareEmp(); // SearchLastString secstr = new SearchLastString(); strcmp.printCompare(); // secstr.printSearch(); System.out.println("function"); } }
①,把前面編譯生成的類文件刪除,重新編譯這兩個源文件。
先編譯StringFunction. java,出現"找不到符號"的錯誤,原因在於,StringFunction. java實例化了一個StringCompareEmp對象,而此時StringCompareEmp還未編譯,調整編譯順序,先編譯StringCompareEmp. java,再編譯StringFunction. java就可以了。詳見圖8:
圖8
②,輸入命令java StringTest. StringFunction,成功執行,詳見圖9:
圖9
3,上面的例子都把源文件放在當前目錄下了,源文件位於其他地方呢?
①,要用到另一個參數"-cp 源文件所在的路徑",表示要編譯的源文件在所示路徑下;此時"-d ."也改為"-d 源文件所在路徑",表示在源文件所在路徑下生成包文件夾,並把類文件放在該文件夾下。詳見圖10:
圖10
②,輸入java -cp StringFunction\src StringTest. StringFunction,成功執行,詳見圖11:
圖11
總結:
①,源文件中有包聲明語句時,編譯時要使用“-d 路徑”參數,表示編譯時自動生成與包同名的文件夾,並把類文件放到該文件夾下,目的是運行時讓JVM能夠在包文件夾下找到要加載的類文件。
②,源文件中有中文字符時,要編譯時要用“-encoding UTF-8”參數,否則編譯有亂碼。
③,當要編譯的多個源文件有引用關系時,先編譯不引用其他類的文件,后編譯有引用的文件,否則編譯會出現“找不到字符”的錯誤。
④,當源文件在非當前路徑下時,編譯或運行時要用到“-cp 源文件所在路徑”參數,表示到所給路徑下尋找源文件。
待學習:
①,用javac *.java解決類之間相互引用時,編譯順序問題
②,JVM如何加載類
③,變量,代碼塊等在內存如何存儲