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 のインスタンスをスケジュール メソッドのパラメーターとして渡しますか?

4

3 に答える 3

5

これは Flight のインスタンスまたは SouthWestFlight のインスタンスをスケジュール メソッドのパラメーターとして渡しますか?

のインスタンスはFlight、まさに のインスタンスですSouthWestFlight。2 つの異なるインスタンスはありません。SoutWestFlight インスタンスフライトです。Flight実際には、インスタンス自体を抽象化することはできません。

于 2013-09-22T02:13:17.353 に答える
3

とのインスタンスはFlightSouthhWestFlight実際には同じインスタンスです。渡すインスタンスは 1 つだけで、それが渡されます。

于 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();
    }
}

出力:
SouthWest へのフライトをスケジュール
ReadyToGo: true

結論
ここで、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。2 番目のgetType()メソッドは で定義されているため、のフィールドをSouthWestFlight返します。 typeSouthWestFlight

あなたがそれを明確にしたことを願っています。間違いや不明な点がありましたらコメントしてください。

于 2013-09-22T03:09:22.217 に答える