为什么一类相同的包不能访问另一类?

时间:2015-01-22 19:55:09

标签: java package

package MyPack;
class Balance
{
    String name;
    protected double bal;
    Balance(String n, double b)
    {
        name=n;
        bal=b;
    }
    void show()
    {
        if(bal<0)
        System.out.print("--> ");
        System.out.println(name+": $" +bal);
    }
}

类:AccountBalance

package MyPack;
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();
    }
}

我已将这两个类放在Balance.java和AccountBalance.java中。这两个文件都在E:/ programs / MyPack中。 Balance.java编译没有错误但是当我编译AccountBalance.java时它给出了错误:找不到符号“Balance”。

我无法弄清楚为什么两个类都在同一个包中声明?

我正在使用MyPack进行编译 javac Balance.java javac AccountBalance.java

2 个答案:

答案 0 :(得分:2)

假设您从javac以外的某个文件夹发出E:/programs命令,则需要指定一个-cp选项,其中包含包含Balance的位置类。

这是因为如果未指定选项,javac将使用当前目录

  

如果未指定CLASSPATH-cp-classpath,则为用户类   path由当前目录组成。

所以如果你这样做了,例如,

E:/> javac programs/MyPack/AccountBalance.java 

然后Balance类不在类路径中,编译器会给你看错。

在这种情况下,您需要为类路径指定显式位置。例如

E:/> javac -cp programs programs/MyPack/AccountBalance.java 

由于Balance位于MyPack的根/E/programs,因此编译器会找到它并可以使用它。


使用IDE。

答案 1 :(得分:0)

假设您使用javac,原因是您逐个编译它们(首先Balance然后AccountBalance)并且您不在MyPack的父文件夹中。如果您确实这样做,请使用-cp的{​​{1}}选项指出已编译的javac的位置。例如:

Balance.class

或者将两者兼容,例如:

..\so\src\MyPack>javac Balance.java

..\so\src\MyPack>javac -cp ../. AccountBalance.java