0

答えに従う方法が正しいかどうか混乱しています。

class Cat {
    public void isClawedBy(Cat c){
        System.out.println("Clawed by a cat");
    }
}

class Kitten extends Cat{
    public void isClawedBy(Kitten c){
        System.out.println("Clawed by a Kit");
    }
}

以下が呼び出された場合

Cat g = new Cat();
Cat s = new Kitten();
Kitten t = new Kitten();

g.isClawedBy(t);
s.isClawedBy(t);
t.isClawedBy(t);

答えは? 猫の爪 猫の爪 子猫の爪

なぜ s.isClawedBy(t) = Clawed by Cat なのか混乱しています。s の動的型は子猫なので、t は子猫です。引数が違うから上書きしないのでしょうか?

私が混乱している別の部分。//引数が入れ替わっていることに注意してください。

class Cat {
    public void isClawedBy(Kitten c){
        System.out.println("Clawed by a cat");
    }
}

class Kitten extends Cat{
    public void isClawedBy(Cat c){
        System.out.println("Clawed by a Kit");
    }
}

以下が呼び出された場合

Cat g = new Cat();
Cat s = new Kitten();
Kitten t = new Kitten();

g.isClawedBy(t);
s.isClawedBy(t);
t.isClawedBy(t);

出力は次のとおりです。 Clawed by Cat Clawed by Cat Clawed by Cat

t が呼び出されたときにどのように機能しますか?

4

4 に答える 4

3

2 番目のクエリについて:t.isClawedBy(t)の出力を示しClawed by Catます。

tは でKittenあり、メソッドに渡される引数t.isClawedBy(t)もであるためKitten、スーパークラスのメソッドCatは引数と完全に一致するため、呼び出されます。

于 2013-06-10T03:28:06.850 に答える
0

最初の質問は。

解決のオーバーライドは実行時に行われますが、解決のオーバーロードはコンパイル時に行われます。
メソッドのシグネチャは同一ではないため (パラメーターの型が異なります。別のサブクラスであることは問題ではありません)、それらはオーバーロードしています。

コンパイル時に解決されるため、コンパイラはインスタンス タイプが何であるかを知りません。宣言された型のみ。
コンパイラにとっては、宣言された型s.isClawedBy(t) のメソッド です。 コンパイラは、「はい、Cat はそのメソッドで Kitten を受け入れることができます。それがこのメソッドです」と言います。 したがって、実行時にどのメソッドが呼び出されるかは、コンパイラによってすでに選択されています。ルックアップは実行時に実行されません。isClawedBy(Kitten) Cat

したがって、実行時に、s実際には Kitten オブジェクトであるにもかかわらず、Cat メソッドが呼び出されます。

于 2013-06-10T04:32:17.797 に答える
0

なぜ s.isClawedBy(t) = Clawed by Cat なのか混乱しています。s の動的型は子猫なので、t は子猫です。

s には参照型Catがありますが、オブジェクトを保持していKittenます。t は参照型Kittenを持ち、 object を保持しますKitten。実行時にメソッドが実行されると、参照型にそのようなメソッドがあるかどうかが最初にチェックされ、次にメソッドの最も具体的なバージョンが呼び出されます。サブクラスはメソッドをオーバーライドしないため (パラメーターの型が異なる)、参照型のメソッドが呼び出されます。

2番目の部分では、まったく同じことが起こっています。オーバーロードはなく、参照型のメソッドに子猫を実際にCatとして渡すことができるため、このメソッドは階層内で最も具体的なものであり、呼び出されます。

于 2013-06-10T03:40:56.427 に答える
0

Class Kitten はオーバーライドしませんisClawedBy(Cat c)。新しいメソッドを追加しますisClawedBy(Kitten c)。ランタイムはが呼び出された時点でs参照されていると見なし、最終的に Cat メソッドを呼び出します。Cats.isClawedBy(t)

Kitten を次のように変更した場合:

class Kitten extends Cat{
@Override
    public void isClawedBy(Cat c){
    System.out.println("Clawed by a Kit");
    }
}

次に、希望する出力が表示されます。さらに興味深いことに、次のことができます。

((Kitten) s).isClawedBy(t);呼び出された適切なメソッドが表示されます。

于 2013-06-10T03:20:21.713 に答える