Java學習筆記5---命令行下用javac,java編譯運行含package語句的類


對於筆記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) );
            
    }
}
View Code
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");
    }
}
View Code

 

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");
    }
}
View Code

 

 ①,把前面編譯生成的類文件刪除,重新編譯這兩個源文件。

先編譯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如何加載類

③,變量,代碼塊等在內存如何存儲


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM