• 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 StringFunctionsrc StringTest. StringFunction,成功执行,详见图11:

     图11

    总结:

    ①,源文件中有包声明语句时,编译时要使用“-d 路径”参数,表示编译时自动生成与包同名的文件夹,并把类文件放到该文件夹下,目的是运行时让JVM能够在包文件夹下找到要加载的类文件。

    ②,源文件中有中文字符时,要编译时要用“-encoding UTF-8”参数,否则编译有乱码。

    ③,当要编译的多个源文件有引用关系时,先编译不引用其他类的文件,后编译有引用的文件,否则编译会出现“找不到字符”的错误。

    ④,当源文件在非当前路径下时,编译或运行时要用到“-cp 源文件所在路径”参数,表示到所给路径下寻找源文件。

    待学习:

    ①,用javac *.java解决类之间相互引用时,编译顺序问题

    ②,JVM如何加载类

    ③,变量,代码块等在内存如何存储

  • 相关阅读:
    Linux系统组成及初识
    Linux基础入门
    计算机和操作系统发展历史
    Swift,Objective-C,C,C++混合编程
    Objective-C数组和字典
    Java生成随机数字和字母组合10位数
    注册和登录
    IDEA的开发
    登录时@RequestBody报的错
    Java过滤特殊字符和表情
  • 原文地址:https://www.cnblogs.com/chanchan/p/7613261.html
Copyright © 2020-2023  润新知