9

これはただの好奇心からの質問です。

サブクラス オブジェクトのオーバーライドされたメソッドをそのスーパークラスの参照によって呼び出す場合、JVM は参照の型ではなくオブジェクトの型を重視することを私は知っています。

これは私の簡単なコードです:

class Animal
{
    void eat()
    {
        System.out.println("Animal is eating...");
    }
}
class Horse extends Animal
{
    @Override
    void eat()
    {
        System.out.println("Horse is eating...");
    }
}
public class PolymorphismTest
{
    public static void main(String...args)
    {
        Animal a=new Animal();
        a.eat();

        Animal h= new Horse();
        h.eat();
    }
}

予想通り、出力が得られます:

run:
Animal is eating...
Horse is eating...
BUILD SUCCESSFUL (total time: 0 seconds)

ここで私の質問は、参照 h を使用して、サブクラスではなくスーパークラスの eat() メソッドを呼び出す方法はありますか? これがポリモーフィズムの法則に多少反する質問であることは承知していますが、いつそうする必要が生じるかはわかりません。

参照 h を Animal に型キャストしようとしましたが、うまくいきませんでした。何か案は?

4

4 に答える 4

5
class Horse extends Animal
{
    @Override
    void eat()
    {
        super.eat();
    }
}
于 2012-06-11T18:07:59.440 に答える
4

いいえ、オーバーライドされたメソッド (つまりsuper.eat()) で明示的に行う必要があります。

于 2012-06-11T18:08:08.300 に答える
2

Java - すべてのメソッドは、関数の呼び出し中に使用される最新の実装である仮想メソッドです。

あなたの質問に答えるためにstatic、アニマルクラスでメソッドを作成してください。アニマルクラスのeatメソッドが呼び出されます。

static void eat(){ 
      System.out.println("Animal is eating..."); 
}
于 2013-05-09T11:01:22.973 に答える
2

これは、どのような形式の型キャストでも実行できません。スーパークラスのメソッドを呼び出す唯一の方法は、Brett Holt が示したようにラップするか、最も具体的なランタイム タイプが Animal であるオブジェクトが必要です。

于 2012-06-11T18:09:13.943 に答える