你这个问题应该和classpath没有关系,我想要不你把classpath=.;e:\的.去掉试一试结果。
真的想不通你这个问题。
真的想不通你这个问题。
解决方案 »
- 一个小问题,帮个忙
- 初学大家别见笑啊~~看看我的代码怎么运行if判断不了我输入的条件啊~~
- j2se完成之后,我该继续看什么书?
- 我想知道JAVA怎样连接远程打印机?
- Socket 封包问题!再线急等ing!!!!!!
- 一个很有意思的需求!--请大侠指教如何实现!
- SWT连接视频设备DVR-DVS;SWT与视频;SWT与摄像头
- ant的build.xml问题请教。。。
- 我是JAVA菜鸟:请问JAVE与JavaScript到底有什么区别,是一种什么关系!
- scjp(10)
- 关于java环境变量的设置
- 安装了jbuilder4,但不好删除,没有删除菜单 控制面板中也不好删除(没有此项jbuilder4)
那么你用import c05.*;这就重复引入Foreign了,当然出错了,
因为你重复引用了Foreign,所以才会报错的!
http://expert.csdn.net/Expert/topic/1395/1395087.xml?temp=.8244593
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这个类,所以无论在哪里都会正常工作
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、有包客户类的源代码和服务类的源代码可以在同一目录中;
谢谢tangshancheng兄的辛勤劳动