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