我有以下两个源文件
文件世界.java
package planets;
public class World {
public static void main(String[] args) {
Mars.land();
}
}
文件月亮.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 的核心 Java 第 1 卷,第 10 版。在第 192-193 页上说:
[...]您可以从当前包中导入非公共类。这些类可以在具有不同名称的源文件中定义。如果从当前包中导入一个类,编译器会搜索当前包的所有源文件以查看哪个源文件定义了该类。
此外,我尝试使用 Eclipse Oxygen 编写这些文件,并且编译没有问题。但我知道 Eclipse 使用不同的编译器。
为什么javac
编译器会失败?
编辑:我没有设置CLASSPATH
变量。因此,默认情况下编译器会在当前目录中查找。