大家看看我的classpath:.;C:\Program Files\Java\jdk1.5.0\lib\tools.jar;C:\Program Files\Java\jdk1.5.0\lib\dt.jar;C:\Program Files\Java\jdk1.5.0\bin;我自己建了个包,但是同个包里的类死活就是没办法互相调用。大家帮我看看到底是什么问题吧
调试欢乐多
还是不行
package MyPack;class Balance
{
String name;
double bal;
Balance(String n,double b)
{
name=n;
bal=b;
}
void show()
{
if(bal<0)
System.out.print("-->");
System.out.println(name+":$"+bal);
}
}
class AccountBalance
{
public static void main(String args[])
{
Balance current[]=new Balance[3];
current[0]=new Balance("K.J.Fielding",123.23);
current[1]=new Balance("Will Tell",157.02);
current[2]=new Balance("Tom Jackson",-12.33);
for(int i=0;i<3;i++) current[i].show();
}
}
package MyPack;public class Balance1
{
String name;
double bal; public Balance1(String n,double b)
{
name=n;
bal=b;
}
public void show()
{
if(bal<0)
System.out.print("-->");
System.out.println(name+": $"+bal);
}
}
import MyPack.*;class TestBalance
{
public static void main(String args[])
{
Balance1 test=new Balance1("J.J.Jaspers",99.88); test.show();
}
}
编译TestBalance.java的时候出现---------- javac ----------
TestBalance.java:1: package MyPack does not exist
import MyPack.*;
^
TestBalance.java:7: cannot access Balance1
bad class file: .\Balance1.class
class file contains wrong class: MyPack.Balance1
Please remove or make sure it appears in the correct subdirectory of the classpath.
Balance1 test=new Balance1("J.J.Jaspers",99.88);
^
2 errorsOutput completed (1 sec consumed) - Normal Termination
比如说你的包名为 MyPack,放在 f:\java 目录下,则你的 classpath中要是这样的
%classpath%;f:\java
( abc.jar 中有 /com/domain/site/MyClass.class , classes 下面有 /net/domain/site/YourClass.class)现在我要找 MyClass.class , 在 ClassLoader 看来: 目录结构如下:/com/domain/site/MyClass.class
/net/domain/site/YourClass.class要找 com.domain.site.MyClass,
ClassLoader 把 '.' 替换成 '/' , 然后开始搜索文件,这样 ClassLoader 的视野中,所有的东西都是从一个根开始的,但是 实际上 每个 jar 或 classFolder 都是一个 根, 就好像一个“树林”,classPath 中每个元素都是一棵树, ClassLoader 搜索一个 class 或按 classpath 中出现的顺序轮流查询每个 classFolder 或 jar ,如果按照上面的路径名替换能找到类的话就返回,也就是说如果有重复的前面的优先, 记住 它是从哪儿开始搜索的! 根在哪儿,对应到你的磁盘路径的什么地方,上面的这个 MyClass.class 包名是 com.domain.site, 所以当根 在 E:/classes 时,它应该出现在E:/classes/com/domain/site/MyClass.class 这个位置,先对准根,后面的就依次放置, YourClass.class 在一个 jar 中,他就应该在 /net/domain/site/YourClass.class 位置,如果不对的话,用 WinZip/WinRar 挪动一下位置。Java 采用包名,让不同的操作系统/不同的资源加载方式(比如Jar,HttpClassBase,FTPClassLoader)下,都为类加载提供一个同样的视图, 这样就让我们的代码跨平台,因为具体需要部署代码时,classpath 可以根据不同的情况指定,代码不需要修改, Java 通过这种方式很好地解决问题,也能很好的扩展类加载查询方式,能在分布式环境中使用(那个时候可能实现根本不知道类在什么地方,程序不停地广播自己已有的资源,其他的节点可以来下载) 。
我就是这么做的,不用上面说得这么麻烦
所以假设你的 源文件夹在 C:/src 下面:
那么你的 java 文件应该是这个位置:
C:\src\MyPack\Balance.java
C:\src\MyPack\Balance1.java
C:\然后:
C:\> md classes
C:\> cd src
C:\src\> javac -d C:\classes MyPack\Balance.java
C:\src\> javac -d C:\classes MyPack\Balance1.java
C:\src\> javac -d C:\classes MyPack\TestBalance.javaC:\src\> cd ..\classes
C:\classes\> java MyPack.AccountBalance
C:\AnotherPath\>java -cp C:\classes MyPack.AccountBalance注意每一个文件的位置和 你敲 javac 和 java 时当前目录的位置。
当我在 C:\classes 位置时没有添加 classpath ,但是我在 C:\AnotherPath\> 时添加了 Classpath
C:\classes, 这样, JVM 尝试 以 C:/classes 目录为根, 以包名为子目录名搜索 AccountBalance.class 文件, 注意这里所说的 “以xxx为根”,弄明白我为什么强调过几次了。