0

我有一个抽象类 Flight。Flight 包含调用私有方法 schedule(final Flight f) 的方法 schedule()

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 的类 SouthWestFlight

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

这会将 Flight 的实例或 SouthWestFlight 的实例作为参数传递给 schedule 方法吗?

4

3 回答 3

5

这会将 Flight 的实例或 SouthWestFlight 的实例作为参数传递给 schedule 方法吗?

它的实例Flight正是 的实例SouthWestFlight。您没有2 个不同的实例。您的 SoutWestFlight 实例是一个航班。实际上,您不能拥有Flight实例本身,因为它是抽象的。

于 2013-09-22T02:13:17.353 回答
3

Flight和的实例SouthhWestFlight实际上是同一个实例。只有一个实例可以通过,它将通过。

于 2013-09-22T02:13:21.053 回答
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:真

结论
这里的SouthWestFlight对象仍然是一个Flight对象。
但是当你扩展一个类时,子类会覆盖父类的所有方法。
这就是isReadyToGo()SouthWestFlight() 返回 true 的原因。
没有任何属性被覆盖。
这就是为什么this.getType()返回Flight
但是,如果您getType()使用这样的新方法覆盖该方法SouthWestFlight

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

它将返回type. SouthWestFlight想知道为什么?
这是因为,第一个getType()方法是在 parent 中定义的class Flight。所以它返回type. class Flight第二种getType()方法在中定义,因此 SouthWestFlight它返回type.SouthWestFlight

希望你已经清楚了。如果您发现任何错误或有任何疑问,请发表评论。

于 2013-09-22T03:09:22.217 回答