我自己写了四个类,分别放在四个文件中,假定名字分别为1.Java,2.Java,3.Java,4.java 
2.Java  3.Java  4.Java 分别是实现特定功能,而1.Java调用它们以实现我的目的,我在每个文件开头加上:package Share_Web; 想把它们的类文件放到其中,但我编译时就出错了,(javac -d . *.java),说是找不到类2 3 4(2 3 4 编译通过),这是什么原因啊在同一目录下,Java文件之间不可以自由调用吗?我以前写过一些相同的好像就可以调用啊,是因为package的问题吗?但去掉package好像也不行,谁能系统的讲一下,不胜感激!

解决方案 »

  1.   

    先建立文件夹Share_Web,将四个类拷贝至其中
    在根目录,使用命令 javac Share_Web/*.java编译
      

  2.   

    是不是classpath没有设置好?
      

  3.   

    你要确定把这四个文件都放在Share_Web中
      

  4.   

    最好是文件夹的名字和路径与包名相对应,这样出错就会少编译的时候这样编译,比如你的1.java打的包是com.aaa你的1.java最好放在一个com文件夹下面的aaa文件夹下面,然后在和com文件夹平级的目录运行javac -d com/aaa 1.java执行的时候java com.aaa.1.java,如果按这种方法,引其它三个类没问题的。
      

  5.   

    你看一下我这个例子:
    [code=Java]
    //JDK 5.0
    //_1.javapackage Share_Web;class _1 {
      public static void main(String[] args) {
        _2.print();
        _3.print();
        _4.print();
      }}//JDK 5.0
    //_2.javapackage Share_Web;class _2 {
      static public void print(){
        System.out.println(2);
      }
    }//JDK 5.0
    //_3.java
    package Share_Web;class _3 {
      static public void print(){
        System.out.println(3);
      }
    }//JDK 5.0
    //_4.java
    package Share_Web;class _4 {
      static public void print(){
        System.out.println(4);
      }
    }
    编译:javac -d . *.java
    结果:
    生成了一个Share_Web目录运行:java Share_Web/_1
    结果:
    2
    3
    4
      

  6.   

    你们说得都很对,不过那天我在网上找到一份更详细的讲解,大家可以看看: 
    这是由于你对classpath中的 . 理解不深的原因.它表示:当编译某个.java文件时,java虚拟机会搜索该文件所在目录下的所有.class文件以得到在.java文件中所使用的.class文件.而在此所说的所有的.class文件并不是真正意义上的所有.class文件,它有两种含义:1)与.java文件定义了相同包路径的的所有.class文件。比如:正在编译的.java文件中定义在包com.mypack中(即在程序开头定义package com.mypack;),则它只能在当前目录下搜索定义了同一个包(com.mypack)的.class文件。2) 假如A.java中没有定义任何包,并且它被放到了某个.java文件所定义的包路径中。比如把A.java放到了1)中定义的com\mypack中,此时的A只能通过classpath中的 . 搜索com\mypack目录下所有未定义任何包的.class文件,而不能搜索到定义了com.mypack的.class文件了。
        有了上面的解释后,再回来看看你的程序:
        1) 你将PackagedClass和Foreign都定义在包c05.local中(即都定义了"package c05.local;"语句)时:这就是上面介绍的第一种情况了,由于两个.java文件都定义了同一个包中,所以在编译的时候,Foreign.java能够根据classpath中的 . 找到PackagedClass.class文件(前提是PackagedClass.java必须先被编译PackagedClass.class文件),所以编译能够通过。
        2)假如你在PackagedClass.java中定义了"package c05.local;"语句,但没有在Foreign.java定义"package c05.local"语句,并且把它们都放到了c05.local(表示相对目录)目录下时,这就是上面所说的第二中情况了。也就是说,Foreign.java文件只能通过classpath中的 . 搜索到所有的没有任何包定义的.class文件了,所以它就不能搜索到PackageClass.class文件,所以会报错。
        
        解决方法:
        1)就像上面的第一种情况,在两个源程序中都定义同一个包。
        2)就是上面说的第二种情况,即在PackagedClass.java中定义包c05.local,而在Foreign.java中不定义任何包,此时应该在Foreign中添加这么一句:import c05.local; ,再将c05所在目录添加到classpath中,再编译也就没问题了。