package abc;
public class One{
  public int i;
  One(int j){
    this.i = j;
  }
  void outPrn(){
    System.out.println("----------" + i);
  }
}package abc;
public class Two{
  public static void main(String args[]){
    One t = new One(12);
    t.outPrn();
  }
}javac One.java 时没问题,当javac Two.java的时候却出现了问题。提示找不到类文件One,这是怎么回事?两个文件都在同一包abc下。大家可以运行一下,就会发现问题。

解决方案 »

  1.   

    楼主,经我测试,编译没有问题,我是用javac *.java 编译的.估计你编译Two之前没有编译One
      

  2.   

    如果编译可以通过,在运行的时候 java Two时 则出错!
      

  3.   

    编译的时候在abc上层目录,带上包名,javac abc/One.java
      

  4.   

    输出结果如下
    -------------------------------
    C:\One>javac Two.javaC:\One>java Two
    ----------12C:\One>
      

  5.   

    其实带package的java源文件编译的时候最好带上-d参数,能自动生成包目录
      

  6.   

    编译的时候在abc上层目录,带上包名,javac abc/One.java
    --------------------------------------------------------输出结果如下
    -------------------------------
    C:\One>javac Two.javaC:\One>java Two
    ----------12C:\One>
    -----------------------------------------------------------
    我只想在生成class文件后在包abc下执行One.java 和Two.java 解析后 生成的class文件都放在包abc下,为什么在abc下执行Two时会出错呢。
    例如:
    在命令行输入
    d:\abc\java Two
      

  7.   

    你把CLASSPATH设置好就没问题拉
      

  8.   

    我想知道为什么执行d:\abc\java Two后会出现错误?
      

  9.   

    有没有把当前目录加入到classpath里面?
      

  10.   

    为什么要加呢
    现在包abc下的class文件都是解析完的,直接运行不可以吗?d:\abc\java Two
    各位能告诉我为什么吗?谢谢了
      

  11.   

    我想知道lang这个包放在哪个文件夹里.其它的类所在的包又放在哪里?还有classpath值在我的环境变量里面根本没设.这个classpath值是不是在编译器在编译时的当前文件夹下找不到所需的类就会去classpath那个路径去找所需的类?当我们自己写了一些类,然后把它们放到一个文件夹(也就是包?)里.我在新的项目里要调用里面的类时要怎么办?(这个也应该是楼主想知道的.)
      

  12.   

    首先让我们来做这样一个假设,你的这个.java都在c:\abc\这个目录下面,即:
        c:\abc\One.java
        c:\abc\Two.java (先不管系统的那个CLASSPATH变量)
    你在Two中引用了One,其实不用先编译One再编译Two,而是直接编译Two就行了,这是Java的特性,事实上如果你在Two中引用了很多,有One Three Four,难道你一个个先编译它们?
        现在说编译. 
        要注意你这个类One和Two都声明了在包abc中.如果你在c:\abc\目录下编译是通不过的.你可能想这样:javac Two.java,但是会提示你找不到One.java.你会想了这个类是在abc目录下呀,不就是在包abc中吗,这样想就错了.如果你真想在c:\abc\目录下编译我建议你这样做:
        建一个目录abc,即形成c:\abc\abc\,把两个文件都放进去c:\abc\abc\One.java Two.java
    然后javac -sourcepath . abc\Two.java.我解释一下sourcepath表示要在后面的路径中找到Two.java中用到的其它类,这里是One.那个 .(点) 表示是当前目录,你会说当前目录也就是c:\abc\中没有One啊,但是One是在包abc中的,所以JVM在当前目录下找到包abc再找到里面的One.java.后面的abc\Two.java是告诉JVM在Two.java是在哪里.这样,会在c:\abc\abc\下得到One.class和Two.class,现在明白了吗,第二个abc才被JVM认做是package abc.
        如果是在c:\下编译这样javac -sourcepath . abc\Two.java. sourcepath参数可以不要.此时JVM就把abc文件夹当作是package abc.这样,会在c:\abc\下得到One.class和Two.class.
        下面来运行.如果你现在理解了包那么对这句就不会感到奇怪:
        java -cp . abc.Two
        解释一下 cp表示要在后的路径中找到Two用到的其它类,这跟上面sourcepath差不多,但不能省略(如果你没有设置CLASSPATH变量). abc.Two这是完整的类名:包名.类名 你不是说Two属于包abc吗,那就得带上它.
      

  13.   

    晕死,楼上的怎么解释了这么多。。
    原因很简单,若在abc下运行java Two,类加载器会根据源文件用的包名abc,在当前的abc目录下再去找子目录abc中的Two.class来加载,当然找不到!
    若在abc的上级目录下运行java abc/Two,则类加载器可以找到abc目录下的Two.class文件
      

  14.   

     回复人:zhuruijay(小猪) ( 一级(初级)) 信誉:100
       回复人:tcpipokokok() ( 一级(初级)) 信誉:100
       回复人:sonyejin(春去春又来) ( 二级(初级)) 信誉:99
    你们的是正解!万分感谢各位!谢谢大家的参与!!
      

  15.   

    建议LZ看看 《Java深度立险》 第 5 章,专讲 package,import 的机制的(我个人觉得结合第 2 章更完整)。
      

  16.   

     回复人:dengsf(free c j) ( 二级(初级)) 信誉:100
    谢谢!!
      

  17.   

    恩 在abc的上层目录
    javac abc/Two.java    //One.java 也被编译
    java abc/Two顺利通过