你这个问题应该和classpath没有关系,我想要不你把classpath=.;e:\的.去掉试一试结果。
真的想不通你这个问题。

解决方案 »

  1.   

    这就是因为Foreign处于E:\c05,但不属于package c05
      

  2.   

    我的意思是把import c05.*;改成package c05;就搞定了另外shaxiren你有点钻牛角尖了,有些问题你不一定非得搞得水落石出,一清二白的,(你的问题其实我也不能100%的讲清楚,我怀疑这完全是sun当初设计时的一个纰漏)你只要能让它运行了就可以了。你把这点时间放到研究代码,多写点程序难道不比在classpath问题上纠缠不清好很多吗?
      

  3.   

    我想既然Foreign处于E:\c05,又没有包名,所以他就默认包含在c05这个包中,
    那么你用import c05.*;这就重复引入Foreign了,当然出错了,
      

  4.   

    我问你的问题你还不回答呢,shine333,是不是怕我不给你分那。
      

  5.   

    sharpwind(锐风)和shine333说的其实是一样的, 
    因为你重复引用了Foreign,所以才会报错的!
      

  6.   

    我遇到过这样的问题,将PackagedClass.java源文件放到别的文件夹就一切OK了,不知道是何原因。
      

  7.   

    看看老大们的回复吧:
    http://expert.csdn.net/Expert/topic/1395/1395087.xml?temp=.8244593
      

  8.   

    这个有什么想不通的,你是研究JAVA还是JAVAC,我根据你提供的条件可以猜测JAVAC的调入非标准包的策略如下:
    1、如果import写的是一个具体的类,首先使用当前CLASSPATH中的.class文件,当然这个文件必须按照路径放好,如果CLASSPATH中找不到这个.class文件,那么就从被编译文件的目录下面寻找相应的.java文件,如果存在,则编译他,并掉入这个编译完的类
    2、如果import写的是*,则无法判断应该掉入哪些类,所以默认不做任何操作
    3、在程序中碰到一个类,如果这个类是用一个import语句和这个具体的类引进来的,那么他在第一步已经被调入当前的classloader中了,那么javac不需要做任何寻找这个类的动作
    4、如果这个类没有被一个明确的import语句引进来,那么javac必须依靠一些策略调入他
    4.1、首先从当前目录中寻找.java文件,并且编译他,默认应该是和这个文件使用相同的包或者是无名包,这个取决于javac的具体实现
    4.2、在每个不确定的import中匹配这个类,根据你写的顺序匹配,无法匹配到就报错所以你的问题如下
    第一种情况,javac会从当前目录调入.java文件,并且使用无名包,根据规则4.1,但是你的packageClass有包名,所以会发生错误,因为编译完了以后会调入packageClass这个类,而正确情况应该调入c05.packageClass这个类
    第二种情况,当前目录中不存在packageClass.java文件,所以javac应该根据规则4.2在不确定import中匹配这个类,则会调入CLASSPATH中的c05.packageClass这个类,所以不会发生错误
    第三种情况,根据规则1,无论在哪里都会调入CLASSPATH中的c05.packageClass这个类,所以无论在哪里都会正常工作
      

  9.   

    很多人有此问题。做了个简单总结,希望对你有帮助://关于package的用法假定:
    1、JDK的环境变量:
    JAVA_HOME=F:\j2sdk1.4.0_02
    Path=E:\WINNT\system32;E:\WINNT;E:\WINNT\System32\Wbem;f:\j2sdk1.4.0_02\bin;
    CLASSPATH=.; F:\java;F:\j2sdk1.4.0_02\lib;
    2、目录:
    F:\java3、源文件:
    F:\java\Vector.java
    F:\java\List.javaF:\java\LibTest.java4、文件内容
    -------------------------
    //: List.java
    // Creating a package 
    package com.bruceeckel.util;public class List {
      public List() {
        System.out.println(
          "com.bruceeckel.util.List");
      }
    } ///:~
    -------------------------
    //: Vector.java
    // Creating a package
    package com.bruceeckel.util;public class Vector {
      public Vector() {
        System.out.println(
          "com.bruceeckel.util.Vector");
      }
    } ///:~
    -------------------------
    //: LibTest.java
    // Uses the library
    package c03;
    import com.bruceeckel.util.*;public class LibTest {
      public static void main(String[] args) {
        Vector v = new Vector();
        List l = new List();
      }
    } ///:~
    -------------------------5、使用
    F:\java>javac Vector.java -d .
    F:\java>javac List.java   -d .
    F:\java>javac LibTest.java -d .6、生成的目录及类
    F:\java\com\bruceeckel\util\Vector.class
    F:\java\com\bruceeckel\util\List.class
    F:\java\c03\LibTest.class7、执行
    F:\java>java c03.LibTest8、输出结果
    com.bruceeckel.util.Vector
    com.bruceeckel.util.List9、注意
    A、在客户类属于某个包时,如LibTest.java属于包c03:
    a、使用package要保证成功的话,源文件都有放在统一的一个目录中,该目录
    可以是任意目录(因为CLASSPATH中有".;",即当前目录也是类的搜索目录),
    或者特别是CLASSPATH中指定的"F:\java";
    b、编译时指定生成类.class的目标目录,
    即"javac Vector.java -d ."或者"javac Vector.java -d f:\java"之类;
    c、执行时要使用包名.类名,即"java c03.LibTest"-----------------------------------B、在客户类不明确属于某个包时,如LibTest.java中无语句"package c03;":
    a、执行情况如下:
    F:\java>javac LibTest.java -verbose
    [parsing started LibTest.java]
    [parsing completed 120ms]
    [loading f:\j2sdk1.4.0_02\jre\lib\rt.jar(java/lang/Object.class)]
    [loading f:\j2sdk1.4.0_02\jre\lib\rt.jar(java/lang/String.class)]
    [checking LibTest]
    [loading .\Vector.java]
    [parsing started .\Vector.java]
    [parsing completed 20ms]
    LibTest.java:8: cannot resolve symbol
    symbol  : constructor Vector  ()
    location: class Vector
        Vector v = new Vector();
                   ^
    [loading .\List.java]
    [parsing started .\List.java]
    [parsing completed 0ms]
    LibTest.java:9: cannot resolve symbol
    symbol  : constructor List  ()
    location: class List
        List l = new List();
                 ^
    [checking com.bruceeckel.util.Vector]
    [loading f:\j2sdk1.4.0_02\jre\lib\rt.jar(java/lang/System.class)]
    [loading f:\j2sdk1.4.0_02\jre\lib\rt.jar(java/io/PrintStream.class)]
    [loading f:\j2sdk1.4.0_02\jre\lib\rt.jar(java/io/FilterOutputStream.class)]
    [loading f:\j2sdk1.4.0_02\jre\lib\rt.jar(java/io/OutputStream.class)]
    [checking com.bruceeckel.util.List]
    [total 621ms]
    2 errorsb、出错的原因在于编译器的原理:根据"CLASSPATH=.;f:\java;f:\j2sdk1.4.0_02\lib;"
    查找当前目录、f:\java、f:\j2sdk1.4.0_02\lib等目录,来寻找所要类,但如果也找了
    源文件.java,则编译之。
    故由于LibTest.java没有明确属于某个包,则默认成属于根包,故查找到了Vector.java
    和List.java,则编译之,这样就出错了:系统找到了新的类
    (但不属于import中所指的包com.bruceeckel.util)。虽然后面也根据
    "\com\bruceeckel\util"找到了引用的类,但是前面出错了,故停止了。c、解决方法:
    将"F:\java\Vector.java"、"F:\java\List.java"更改名字或移出LibTest.java
    所在的目录;
    或者使用完整的import语句即:
    import com.bruceeckel.util.Vector;
    import com.bruceeckel.util.List;d、执行结果:
    F:\java>javac LibTest.java -verbose
    [parsing started LibTest.java]
    [parsing completed 110ms]
    [loading f:\j2sdk1.4.0_02\jre\lib\rt.jar(java/lang/Object.class)]
    [loading f:\j2sdk1.4.0_02\jre\lib\rt.jar(java/lang/String.class)]
    [checking LibTest]
    [loading .\com\bruceeckel\util\Vector.class]
    [loading .\com\bruceeckel\util\List.class]
    [wrote LibTest.class]
    [total 631ms]F:\java>java LibTest
    com.bruceeckel.util.Vector
    com.bruceeckel.util.List------------------------------------------------------------------10、原则
    a、服务类在包指定的目录内;
    b、根包客户类的源代码和服务类的源代码在不同的目录中;
       或者使用完整import语句(不使用import pacage.×;而使用import pacage.classname;)
    c、有包客户类的源代码和服务类的源代码可以在同一目录中;
      

  10.   

    非常好!
    谢谢tangshancheng兄的辛勤劳动