Не получается создать внутренный класс. В чём ошибка?

У меня есть класс Place, в котором я создаю вложенный класс дверь, который, при вызове isClosed, должен выдавать "дверь находится внутри". Да, я знаю, что выглядит странно но моя задача сделать это именно через внутренний класс (он может быть как нестатическим, так и статическим). Я так думаю, что у меня недостаточно знаний по внутренним классам и видимо переопределять методы внешнего класса нельзя (хотя я видел, что так делают, например в анонимных классах). Подскажите, что делать в таком случае. Может, отправите читать (желательно ссылку, потому что всякие javarush я уже начитался), но я уже просто запутался.

package Entities;

public class Place extends Obj {
    String CLOSED = "находится внутри";
    String OPENED = "открытое место";
    
    public Place (String name){
        super(name);
    }
    //по умолчанию у всех объектов типа Place
    public void isClosed(){
        System.out.println(this.getName() + this.OPENED);
    }
    public class Door{
        public Door(String name){
            super();
        }
        @Override
        public void isClosed(){
            System.out.println(this.getName() + this.CLOSED);
        }
    }
}
Exception in thread "main" java.lang.Error: Unresolved compilation problems:
The method isClosed() of type Place.Door must override or implement a supertype method
The method getName() is undefined for the type Place.Door

Ответы (1 шт):

Автор решения: insolor
  • The method getName() is undefined for the type Place.Door - у вас в классе Door нет метода getName. Добавьте соответствующее поле в этот класс и геттер к нему. Либо отнаследуйте Door от Obj по аналогии как у вас сделано в классе Place (предполагаю, что в Obj и поле, и геттер есть).

  • The method isClosed() of type Place.Door must override or implement ... - у вас класс Door ни от чего не наследуется и не реализует никакой интерфейс, поэтому нужно убрать @Override у метода isClosed. Добавлять @Override имеет смысл только если есть родительский класс или интерфейс, и у него есть такой же метод. Внешний класс - это не родительский класс, родительский класс - тот который указан через extends.

И еще одна проблема: к CLOSED внешнего класса из внутреннего нельзя обратиться через this, т.к. this - это сам объект класса Door, а у него нет поля CLOSED. В данном случае нужно просто убрать this.

Итого получается так:

public class Place extends Obj {
    String CLOSED = "находится внутри";
    String OPENED = "открытое место";

    public Place (String name){
        super(name);
    }

    //по умолчанию у всех объектов типа Place
    public void isClosed(){
        System.out.println(this.getName() + OPENED);
    }

    public class Door{
        private String name;

        public Door(String name){
            super();
        }

        public String getName() {
            return name;
        }

        public void isClosed(){
            System.out.println(this.getName() + CLOSED);
        }
    }
}

С классом Door в данном случае я вижу такую проблему, что его можно создать только из методов класса Place, т.к. Door - не статический класс. Это сильно ограничивает его применимость, но иногда бывает нужно.

Если сделать Door статическим классом (чтобы можно было создавать объекты этого класса отдельно от объектов Place), то CLOSED внешнего класса придется сделать статическим полем.

→ Ссылка