Java - 使用当前包中的非公共类会导致编译错误

时间:2017-07-30 20:29:30

标签: java compiler-errors javac java-package

我有以下两个源文件

File World.java

package planets;

public class World {
    public static void main(String[] args) {
        Mars.land();
    }
}

File Moon.java

package planets;

public class Moon {
    public static void land() {
        System.out.println("Hello Moon");
    }
}

class Mars {
    public static void land() {
        System.out.println("Hello Mars");
    }
}

我们可以看到,Moon.java包含两个类:公共Moon类和非公共Mars类。

文件位于planets目录内,下面显示目录树

+current-dir:
+----+planets:
      +----+World.java
      +----+Moon.java

现在,如果我尝试从Windows命令提示符编译(我在current-dir文件夹内),输入

javac planets\World.java

我收到此错误消息:

planets\World.java:5: error: cannot find symbol
       Mars.land();
       ^
  symbol:   variable Mars
  location: class World
1 error

这很奇怪,因为我知道编译器在当前包的所有源文件中搜索非公共类。 Cay Horstmann的 Core Java Vol 1,第10版。第192-193页说:

  

[...]您可以从当前包导入非公共类。这些   可以在具有不同名称的源文件中定义类。如果你   从当前包导入一个类,编译器搜索所有   当前包的源文件,以查看哪个定义了   类。

此外,我尝试使用Eclipse Oxygen编写这些文件,并且编译没有问题。但我知道Eclipse使用不同的编译器。

为什么javac编译器失败?

编辑:我没有设置CLASSPATH变量。所以默认情况下编译器会在当前目录中查找。

1 个答案:

答案 0 :(得分:0)

您需要按顺序键入以下命令(在'current-dir'中)

  1. javac planetts \ Moon.java
  2. javac -cp。行星\ World.java
  3. java -cp。 planets.World