0

メソッドを使用して抽象スーパークラス Aninal とサブクラス Dog を使用しているこのコードで問題に直面していますが、有効なオーバーロードをテストし、ここで「a.print(d);」の行をオーバーライドしようとすると、私には明確ではありません。参照 Dog を使用して dog print メソッドを呼び出す必要がありますが、参照 Animal を使用して呼び出します。

 public class TestOverload {
public static void main(String[] args) {
    Animal a = new Dog();
    a.print(a); // DOG class print method is invoked
    Dog d = new Dog();
    d.print(d);// DOG class print method is invoked
    a.print(d);// PROBLEM ::: it should invoke DOG print method with reference
                         DOG but its invoking 1 with reference Animal


   }
 }

abstract class Animal {
public abstract void print(Animal a);


 }

class Dog extends Animal {
public void print(Dog d) {
    System.out.println(" Dog ");
}

public void print(Animal a) {
    System.out.println("Animal  ");
}
}

誰でもこれで私をクリアできますか

4

5 に答える 5

1

実際、あなたは正しくありません。出力は次のとおりです。

Animal
Dog
Animal

これは、print(Animal a)プリント「Animal」を実装するメソッドのためです。したがって、オブジェクトへの であるオブジェクトを渡すと、実際にはDog「Animal」を出力するオーバーライドが呼び出されます。ここには怪しいものは何もありません。instanceofAnimalAnimalaprint(Animal a)

于 2013-06-12T13:04:28.390 に答える
1

あなたの例から、次のメソッドが実行されます:

  1. a.print(a)メソッドを呼び出すDog#print(Animal)
  2. d.print(d)メソッドを呼び出すDog#print(Dog)
  3. a.print(d)Dog#print(Animal)このメソッドは抽象メソッドを実装するため、メソッドを呼び出しますAnimal#print(Animal)

Dog#print(Dog)object を使用してメソッドを実行する場合は、最初aにキャストする必要があります。a

((Dog) a).print(d) // prints DOG

于 2013-06-12T13:08:02.117 に答える
0

犬は依然として動物のインスタンスであるため、その動作です。

次の場合:

public void print(Animal a) {
    if(a instanceof Dog)
        System.out.println(" Dog ");
    else System.out.println("Animal  ");
}

それはあなたが期待することをするでしょう。

于 2013-06-12T13:06:43.173 に答える