zoukankan      html  css  js  c++  java
  • 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如何加载类

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

  • 相关阅读:
    Atitit attilax要工作研究的要素 纪要 方案 趋势 方向 概念 理论
    Atitit 常见每日流程日程日常工作.docx v7 r8f
    Atitit it 互联网 软件牛人的博客列表
    Atitit 信息链(Information Chain)的概念理解 attilax总结
    Atitit 知识点的体系化 框架与方法 如何了解 看待xxx
    Atitit 聚合搜索多个微博 attilax总结
    Atitit 企业知识管理PKM与PIM
    Atitit 项目沟通管理 Atitit 沟通之道 attilax著.docx
    Atitit 项目管理软件 在线服务 attilax总结 1. 项目管理协作的历史 1 1.1. Worktile 406k 1 1.2. Teambition  584k in baidu
    Atitit.每周末总结 于每周一计划日程表 流程表 v8 import 上周遗漏日志补充 检查话费 检查流量情况 Crm问候 Crm表total and 问候
  • 原文地址:https://www.cnblogs.com/chanchan/p/7613261.html
Copyright © 2011-2022 走看看