Почему компилятор Java не находит класс из другого файла? - PullRequest
1 голос
/ 22 марта 2019

Итак, Main.java вызывает класс House из House.java , предполагается один из методов House.class вызов метода из класса Назначение расширяет наследование , которое находится в Succession.java .

Но по какой-то причине компилятор не находит Appointment и предполагает, что это должна быть пропущенная переменная, почему? Если я переместлю класс Appointment в 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(){
    }
}

Ответы [ 2 ]

1 голос
/ 22 марта 2019

Я не уверен, но это может быть причиной:

При компиляции 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 в его собственный файл.

0 голосов
/ 22 марта 2019

Установить модификатор доступа / спецификатор класса назначения как public.Потому что по умолчанию модификатор / спецификатор доступа любого класса равен default, что не разрешает доступ к классу из другого класса.

Убедитесь, что вам нужен доступ к классу извне класса, модификатор / спецификатор доступа классабудет общедоступным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...