为什么 Java 编译器不能从另一个文件中找到 class?

Why doesn't Java compiler find class from another file?

所以,Main.javaHouse.java 调用 class House House.class 的方法之一应该从 class Appointment extends Succession 调用方法, 位于 Succession.java.

但由于某种原因,编译器没有找到 Appointment 并假定它一定是一个缺失变量,为什么?如果我将 Appointment-class 移动到 Main.java 或给它自己的文件,编译器会找到它。

我问这个是因为,我尝试重新创建错误,但我无法...

House.java:

public void succession(){
    if (this.kinsmen.size() > 0){
        Appointment.callHeir(this.head, Main.human.get(1));

Succession.java:

class Appointment extends Succession {
    public static boolean callHeir(Human appointer, Human appointed){

错误:

 error: cannot find symbol
            Appointment.callHeir(this.head, Main.human.get(1));
            ^
  symbol:   variable Appointment
  location: class House

编辑最小化的完整代码:

Main.java:

class Main {
    public static void main(String[] args) {
        House.succession();
    }
}

House.java:

public class House {
    public static void succession() {
        Appointment.callHeir();
    }
}

Succession.java:

class Succession{

}

class Appointment extends Succession {
    public static void callHeir(){
    }
}

我不确定,但这可能是原因:

编译Main.java时遇到House.succession().
它没有找到 House.class 所以它寻找并编译 House.java.

编译House.java时遇到Appointment.callHeir().
它没有找到 Appointment.class,所以它会寻找不存在的 Appointment.java

当我这样改House.java的时候

public class House {
    public static void succession() {
        Succession dummy;
        Appointment.callHeir();
    }
}

一切正常。
这是因为它首先遇到 Succession dummy,这使得编译器寻找 Succession.java。编译该文件,我们自动获得 Appointment.class.

正如其他人已经建议的那样,我强烈建议将 Appointment class 放在自己的文件中。

将约会 class 的访问 Modifier/specifier 设置为 public。 因为默认情况下任何 class 的访问 modifier/specifier 是 default,这不允许从另一个 class.

访问 class

确保如果您需要从 class 外部访问 class,class 的访问 modifier/specifier 将是 public。