В абстрактном классе ключевое слово 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
,
Надеюсь, вы поняли это. Пожалуйста, прокомментируйте, если вы нашли ошибку или получили какие-либо сомнения.