В абстрактном классе ключевое слово this ссылается на родительский или дочерний класс?

У меня есть абстрактный класс Flight. Flight содержит метод schedule(), который вызывает закрытое расписание метода (последний полет f)

public void schedule()
{
    schedule(this);
}

private void schedule(final Flight f)
{
    new Timer().schedule(new TimerTask()
    {
        @Override
        public void run()
        {
            f.checkIn();
            updateList();
        }
    }, this.getDate());
}

Допустим, теперь у меня есть класс SouthWestFlight, который расширяет полет

Flight f = new SouthWestFlight(); //ignore the missing params doesn't matter for example
f.schedule();

Будет ли это передавать экземпляр Flight или экземпляр SouthWestFlight в качестве параметра в методе расписания?

3 ответа

Решение

Будет ли это передавать экземпляр Flight или экземпляр SouthWestFlight в качестве параметра в методе расписания?

Пример Flight это именно тот случай SouthWestFlight, У вас нет 2 разных экземпляров. Ваш экземпляр SoutWestFlight - это полет. На самом деле вы не можете иметь Flight Сам экземпляр, потому что это абстрактно.

Пример Flight а также SouthhWestFlight на самом деле один и тот же экземпляр. Нужно передать только один экземпляр, и он будет передан.

Я подготовил простое тестовое приложение.

public class TEST {

    static abstract class Flight {
        String type = "Flight";
        abstract String getDirection();
        public String getType() {
            return this.type;
        }
        public void schedule() {
            System.out.printf("Scheduled a %s towards %s",this.getType(),this.getDirection());
            System.out.println();
            System.out.printf("ReadyToGo: %s",this.isReadyToGo());
        }
        public boolean isReadyToGo() {
            return false;
        }
    }

    static class SouthWestFlight extends Flight {
        String type = "SouthWestFlight";
        @Override
        String getDirection() {
            return "SouthWest";
        }

        @Override
        public boolean isReadyToGo() {
            return true;
        }

    }

    public static void main(String... args) {
        new SouthWestFlight().schedule();
    }
}

Выход:
Запланированный рейс в направлении SouthWest
ReadyToGo: правда

Выводы
Здесь SouthWestFlight объект все еще Flight Объект.
Но когда вы расширяете класс, дочерний класс переопределяет все методы родительского класса.
Поэтому isReadyToGo() of SouthWestFlight() вернул true.
Ни одно из свойств не переопределено.
Поэтому this.getType() возвращается Flight,
Но если вы переопределите getType() метод с новым методом в SouthWestFlight как это:

@Override
public String getType() {
   return this.type;
}

Он вернется type поле SouthWestFlight, Интересно, почему?
Это потому, что первый getType() метод определяется в родительском class Flight, Так и возвращается type поле class Flight, Второй getType() метод определен в SouthWestFlight так что возвращается type поле SouthWestFlight,

Надеюсь, вы поняли это. Пожалуйста, прокомментируйте, если вы нашли ошибку или получили какие-либо сомнения.

Другие вопросы по тегам