我有一个抽象类Flight。 Flight包含方法schedule(),它调用私有方法调度(最终Flight 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());
}
现在让我说我有一个扩展Flight
的类SouthWestFlightFlight f = new SouthWestFlight(); //ignore the missing params doesn't matter for example
f.schedule();
这会将Flight实例或SouthWestFlight实例作为schedule方法中的参数传递吗?
答案 0 :(得分:5)
这会传递Flight的实例还是实例 SouthWestFlight作为计划方法中的参数?
Flight
的实例它恰好是SouthWestFlight
的实例。您不有2个不同的实例。您的SoutWestFlight实例是A Flight。实际上你不能拥有一个Flight
实例,因为它是抽象的。
答案 1 :(得分:3)
Flight
和SouthhWestFlight
的实例实际上是同一个实例。只有一个实例可以传递,它将被传递。
答案 2 :(得分:2)
我准备了一个简单的测试应用程序。
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();
}
}
<强>输出:强>
预定飞往西南的航班
ReadyToGo:true
<强>结论强>
这里SouthWestFlight
对象仍然是Flight
对象
但是当你扩展一个类时,子类会覆盖父类的所有方法
这就是SouthWestFlight()的isReadyToGo()
返回true的原因
没有任何属性被覆盖
这就是this.getType()
返回Flight
的原因
但是,如果您使用getType()
中的新方法覆盖SouthWestFlight
方法,请执行以下操作:
@Override
public String getType() {
return this.type;
}
它将返回type
的{{1}}字段。想知道为什么?
这是因为,第一个SouthWestFlight
方法是在父getType()
中定义的。因此,它返回class Flight
的{{1}}字段。第二个type
方法在class Flight
中定义,因此它返回getType()
的{{1}}字段。
希望你明白了。如果您发现任何错误或有任何疑问,请发表评论。