Java 中带包的类的编译与执行

Java 中带包的类的编译与执行

HelloWorld.java 为例( 假设该文件的位置是/home/HelloWorld.java):

[java]  view plain  copy
  1. package a.b;  
  2. public class HelloWorld{  
  3.  public static void main(String[] args){  
  4.   System.out.println("Hello World!");  
  5.  }  
  6. }  

下面根据不同的编译方法来讨论:


第一种编译方法( 编译直接生成class 文件,执行需先创建包的路径)
假设当前目录为/src/java/ ,则编译命令为:javac HelloWorld.java

补充: javac 工具读取用 Java 编程语言编写的类和接口定义,并将它们编译成字节码类文件。缺省情况下,编译器将每个类文件与其源文件放在同一目录中。 此处使用缺省的javac则编译完后产生的类文件(.class文件)会在与源文件(.java文件)在同一目录下,此时编译不会产生a目录、b目录。 
假设当前目录为/src/ ,则编译命令为:javac /src/java/HelloWorld.java 或者使用相对路径:javac java/HelloWorld.java 执行完该命令后, 在/src/java/ 目录下生成一个HelloWorld.class 文件。执行文件(在java 目录下新建目录a ,在a 目录下新建目录b 将HelloWorld.class 至于b 目录下;执行java a.b.HelloWorld ),必须要按照包的结构先创建目录。

第二种编译方法( 编译直接生成包的路径)
假设当前目录为/src/java/ ,则编译命令为:javac -d . HelloWorld.java

补充:javac -d . *.java 命令中的 “-d”则是设置类文件的目标目录。如果某个类是一个包的组成部分,则 javac 将把该类文件放入反映包名的子目录中,必要时创建目录。 在此处会自动创建c目录、d目录。在d目录下生成编译后的类文件(HelloWorld.class )  
说明:"." 为指定编译路径为当前目录;生成的HelloWorld.class 所有目录为/src/java/a/b/HelloWorld.class 。
javac -d c/d HelloWorld.java
说明:c/d 为指定编译路径为/src/java/c/d ,同样也可以写成绝对路径如javac -d d:/ HelloWorld.java ,前提是路径必须先存在;生成的HelloWorld.class所有目录为/src/java/c/d/a/b /HelloWorld.class 。
假设当前目录为/src/ ,则编译命令为:javac -d . java/HelloWorld.java
说明:生成的HelloWorld.class 所有目录为/src/a/b/HelloWorld.class 。
javac -d java/c/d java/HelloWorld.java 
说明:生成的HelloWorld.class 所有目录为/src/java/a/b/HelloWorld.class 。

第三种编译方法(先把源文件按照包结构放到指定的目录中,然后执行编译命令)
假设当前目录为/src/java/,先在目录中创建目录/a/b,然后编译命令:
javac a/b/HelloWorld.java

下面总结一下对于带包的类进行编译和执行时的一些要点:
1、编译时可以不考虑包结构的问题,不论用哪种方法,其实本质都是一样的,只需要让javac命令找到所需要编译的原文件(*.java)即可。编译时可以用相对或者绝对路径来为javac命令提供源文件的位置信息。
2、 初学者易混淆classpath的作用,对于java命令的-cp选项和javac命令的-classpath选项,以及配置环境变量时的 CLASSPATH.其作用是不变的:都是指定所需要的class文件的位置。所不同的是,执行javac编译时的-classpath选项用于指定被编 译的源文件需要调用另外的用户自定义类的位置.。执行java命令是根据classpath来寻找所需要执行的class文件的位置;而javac命令不 能根据classpath来找源文件,只能根据classpath来寻找所需要用到的类。 

下面举例来说明该问题:
假设以下代码(位置:/src/java/code/a/b/TestT.java):

[java]  view plain  copy
  1. package a.b;  
  2. import c.d.T;  
  3. public class TestT {  
  4.    public static void main(String[] args) {  
  5.     T t = new T();  
  6.     t.p();  
  7.   }  
  8. }  

引入的文件(位置:/src/java/code/tmp/c/d/T.java)
[java]  view plain  copy
  1. package c.d;  
  2. public class T {  
  3.    public void p(){  
  4.     System.out.println("class:T");  
  5.    }  
  6. }  

假设现在编译两个文件(目录:/src/java/),则编译命令为:javac -classpath code/tmp code/a/b/TestT.java 执行命令为:java -cp code;code/tmp a/b/TestT 
 
如果当前目录为:/src/java/code/,则编译命令为:javac -classpath tmp a/b/TestT.java执行命令为:java -cp .;tmp a/b/TestT    

 
假设现在编译不同磁盘的三个文件(目录:e:/src/java/),则编译命令为:
假设以下代码(位置:e:/src/java/code/a/b/TestT.java):

[java]  view plain  copy
  1. package a.b;  
  2. import c.d.T;  
  3. import e.f.T1;  
  4. public class TestT {  
  5.   public static void main(String[] args) {  
  6.    T t = new T();  
  7.    t.p();  
  8.    T1 t1 = new T1();  
  9.    t1.p();  
  10.   }  
  11. }  

引入的文件1(位置:d:/java/code/tmp/c/d/T.java)

[java]  view plain  copy
  1. package c.d;  
  2. public class T {  
  3.   public void p(){  
  4.    System.out.println("class:T");  
  5.   }  
  6. }  

引入的文件2(位置:c:/code/tmp/e/f/T1.java)
[java]  view plain  copy
  1. package e.f;  
  2.  public class T1 {  
  3.   public void p(){  
  4.    System.out.println("class:T1");  
  5.   }  
  6. }  

如果当前目录为:e:/src/java/
编译命令为:javac -classpath d:/java/code/tmp;c:/code/tmp code/a/b/TestT.java执行命令为:java -cp code;d:/java/code/tmp;c:/code/tmp a/b/TestT

说明:javac命令中的classpath必须指定引入类的路径;同样java命令中的cp必须引入引入类的class的路径也需指定执行类的路径

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值