使用JDK编译

    对于任何给定的输入文件,文件类型决定采用何种工具进行处理。JDK常用的文件类型如表1所示,JDK常用的工具如所示。

    表 1 JDK常用的文件类型

    表 2 JDK常用的工具

    java程序生成流程

    通过JDK将java源代码文件生成并运行Java程序,需要经过编译和运行。

    1. 编译:是指使用Java编译器(javac)将java源代码文件(.java文件)编译为.class的字节码文件。
    2. 运行:是指在Java虚拟机上执行字节码文件。

    javac编译选项

    javac编译的命令格式为:javac [options] [sourcefiles] [classes] [@argfiles]

    其中:

    options :命令选项。

    sourcefiles :一个或多个需要编译的源文件。

    classes :一个或多个要为注释处理的类。

    @argfiles :一个或多个列出选项和源文件的文件。这些文件中不允许有-J选项。

    javac是java编译器,其 options 参数取值很多,但有些大部分并不常用,常用的 options 取值如表3所示。

    表 3 javac常用的编译选项

    java运行选项

    java运行的格式为:

    运行类文件:java [options] classesname [args]

    运行jar文件:java [options] -jar filename [args]

    其中:

    options :命令选项,选项之间用空格分隔。

    classname :运行的.class文件名。

    filename :运行的.jar文件名。

    args:传递给main()函数的参数,参数之间用空格分隔。

    java是运行java应用程序的工具,其 options 参数取值很多,但有些大部分并不常用,常用的 options 取值如所示。

    表 4 java常用的运行选项

    jar打包选项

    jar的命令格式为:jar {c | t | x | u}[vfm0M] [jarfile] [manifest] [-C dir] file

    jar命令参数说明如表5所示。

    表 5 jar命令参数说明

    java类库是以包的形式实现的,包是类和接口的集合。java编译器为每个类生成一个字节码文件,且文件名与类名相同,因此同名的类之间就有可能发生冲突。java语言中,把一组类和接口封装在一个包内,包可以有效地管理类名空间,位于不同包中的类即使同名也不会冲突,从而解决了同名类之间可能发生的冲突问题,为管理大量的类和接口提供了方便,也有利于类和接口的安全。

    除java提供的许多包外,开发者也可以自定义包,把自己编写的类和接口等组成程序包的形式,以便后续使用。

    自定义包需要先声明包,然后在使用包。

    包的声明

    包的声明格式为:package pkg1[.pkg2[.pkg3…]];

    为了声明一个包,首先必须建立一个相应的目录结构,子目录与包名一致,然后在需要放入该包的类文件开头声明包,表示该文件的全部类都属于这个包。包声明中的“.”指明了目录的层次。如果源程序文件中没有package语句,则指定为无名包。无名包没有路径,一般情况下,java仍然会把源文件中的类存储在当前工作目录(即存放java源文件的目录)下。

    包声明语句必须被加到源程序文件的起始部分,而且前面不能有注释和空格。如果在不同源程序文件中使用相同的包声明语句,就可以将不同源程序文件中的类都包含在相同的包中。

    在 Java 中,为了能使用java提供的包中的公用类,或者使用自定义的包中的类,有两种方法。

    • 在要引用的类名前带上包名。

      如:name.A obj=new name.A ();

      其中,name为包名,A为类名,obj为对象。表示程序中用name包中的A类定义一个对象obj。

      示例:新建一个example包中Test类的test对象。

    • 在文件开头使用import来导入包中的类。

      import语句的格式为:import pkg1[.pkg2[.pkg3…]].(classname | *);

      其中,pkg1[.pkg2[.pkg3…]]表明包的层次,classname为所要导入的类。如果要从一个包中导入多个类,则可以使用通配符“*”来替代。

      示例:导入example包中的Test类。

      示例:将example 整个包导入。

      1. import example.*;

    编译不带包的java程序示例

    1. 编写Hello World程序,保存为HelloWorld.java,此处以编译Hello World程序进行举例说明。示例如下:

      1. $ vi HelloWorld.java

      代码内容示例:

      1. public class HelloWorld {
      2. public static void main(String[] args) {
      3. System.out.println("Hello World");
      4. }
      5. }
    2. 在代码目录,执行编译,使用命令:

      编译执行未报错,表明执行通过。

    3. 编译完成后,会生成 HelloWorld.class 文件,通过java命令可执行查看结果,示例如下:

      1. $ java HelloWorld
      2. Hello World
    1. cd到代码目录,此处以用户“~/code”进行举例。并在该目录下创建“~/code/Test/my/example”、“~/code/Hello/world/developers”、“~/code/Hi/openos/openeuler”子目录,分别用于存放源文件。

      1. $ cd ~/code
      2. $ mkdir -p Test/my/example
      3. $ mkdir -p Hello/world/developers
    2. cd到~/code/Test/my/example目录,创建Test.java。

      1. $ cd ~/code/Test/my/example
      2. $ vi Test.java

      Test.java代码内容示例:

      1. package my.example;
      2. import world.developers.Hello;
      3. import openos.openeuler.Hi;
      4. public class Test {
      5. Hello me = new Hello();
      6. me.hello();
      7. Hi you = new Hi();
      8. you.hi();
      9. }
      10. }
    3. cd到~/code/Hello/world/developers目录,创建Hello.java。

      1. $ vi Hello.java

      Hello.java代码内容示例:

    4. ~/code/Hi/openos/openeuler目录,创建Hi.java。

      1. $ cd ~/code/Hi/openos/openeuler
      2. $ vi Hi.java

      Hi.java代码内容示例:

      1. package openos.openeuler;
      2. public class Hi {
      3. public void hi(){
      4. System.out.println("Hi, the global developers.");
      5. }
      6. }
    5. cd到~/code,使用javac编译源文件。

      1. $ cd ~/code
      2. $ javac -classpath Hello:Hi Test/my/example/Test.java

      执行完命令后,会在“~/code/Test/my/example”、“~/code/Hello/world/developers”、“~/code/Hi/openos/openeuler”目录下分别生成Test.class、Hello.class、Hi.class文件。

      1. $ cd ~/code
      2. $ java -classpath Test:Hello:Hi my/example/Test

      执行结果如下所示:

      1. Hi, the global developers.