在抽象类中,“this”关键字是否引用父类或子类?

时间:2013-09-22 02:11:15

标签: java this abstract

我有一个抽象类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

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

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

3 个答案:

答案 0 :(得分:5)

  

这会传递Flight的实例还是实例   SouthWestFlight作为计划方法中的参数?

Flight的实例它恰好是SouthWestFlight的实例。您有2个不同的实例。您的SoutWestFlight实例是A Flight。实际上你不能拥有一个Flight实例,因为它是抽象的。

答案 1 :(得分:3)

FlightSouthhWestFlight的实例实际上是同一个实例。只有一个实例可以传递,它将被传递。

答案 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}}字段。

希望你明白了。如果您发现任何错误或有任何疑问,请发表评论。