为什么同一个包中的一个 class 不能访问另一个?

why one class of same package can't access another?

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);
    }
}

class:账户余额

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

我已将这两个 classes 放入 Balance.java 和 AccountBalance.java 中。这两个文件都在 E:/programs/MyPack 中。 Balance.java 编译没有错误但是当我编译 AccountBalance.java 时出现错误:找不到符号 "Balance".

我不明白为什么两个 class 都声明在同一个包中?

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

假设你使用javac,原因是你一个一个地编译它们(首先Balance然后AccountBalance)并且你不在[=15=的父文件夹中].如果你真的这样做,那么请使用javac-cp选项来指向已经编译的Balance.class。例如:

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

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

或者将它们都强制执行,例如:

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

假设您从 E:/programs 以外的某个文件夹发出 javac 命令,您需要指定一个 -cp 选项,包括包含您的 [=15] 的位置=] class.

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

If neither CLASSPATH, -cp nor -classpath is specified, the user class path consists of the current directory.

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

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

那么 Balance class 将不会在 class 路径中,编译器会给你你看到的错误。

在这种情况下,您需要为 class路径指定一个明确的位置。例如

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

由于 Balance 位于 /E/programs 根目录下的包 MyPack 中,编译器可以找到并使用它。


使用 IDE.