【问题标题】:why one class of same package can't access another?为什么一类相同的包不能访问另一个?
【发布时间】:2015-01-22 19:55:09
【问题描述】:
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 平衡.java javac AccountBalance.java

【问题讨论】:

  • 你如何编译它们?向我们展示您的javac 命令。
  • @SotiriosDelimanolis - 你提供了一个与他一致的链接
  • @brso05 - 如果它们在同一位置,则不需要导入
  • 它完全符合我的要求。我完全复制了你的代码

标签: java package


【解决方案1】:

假设您从E:/programs 以外的某个文件夹发出javac 命令,您需要指定一个-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。

【讨论】:

  • 如果你在E:/programs/MyPack你也应该指定cp...E:/programs就可以了。
  • 您必须使用 javac Balance 从 E:/programs/MyPack 编译 Balance.java。 java 现在你从 E:/programs/MyPack 编译使用: javac -cp E:/programs AccountBalance.java 或 javac -classpath E:/programs AccountBalance.java 如果你从 E:/programs 编译然后使用 javac E:/programs /MyPack/AccountBalance.java 没有其他工作..
  • @abhi 不管你是从哪里编译它都没有关系。重要的是类路径正确并包含所需的类。
【解决方案2】:

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

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

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

也可以同时计算它们,例如:

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

【讨论】:

  • 不,不是。如果编译器使用正确,它可以按任一顺序逐个编译它们。他也可以使用-sourcepath 选项,或者最好在发出命令之前将自己放入正确的工作目录,即包含MyPack 目录的目录。
猜你喜欢
  • 1970-01-01
  • 2011-01-26
  • 2013-07-18
  • 2013-11-25
  • 2014-03-28
  • 1970-01-01
  • 1970-01-01
  • 2020-07-30
  • 2012-04-26
相关资源
最近更新 更多