0

我在这段代码中遇到了一个问题,我有抽象超类 Aninal 和 Subclass 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)打印“动物”的方法。因此,当您将对象传递给Dog对象时,您实际上调用instanceof了打印“Animal”的覆盖。这里没有什么可疑的。AnimalAnimalaprint(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 回答
1

如果我运行您的代码,我会得到以下结果:

Animal  
 Dog 
Animal

所以,Animal每次做a.print()的时候都会调用 print 方法,这很正常,因为在编译的时候,当你调用 时a.print(),你调用的是 的print()方法Animal,它以动物为参数。该方法print(Dog d)不能在此处调用,因为它不会覆盖.print(Animal a)Animal

于 2013-06-12T13:07:09.763 回答
1

因为a是类型Animal,所以a.print从 Animal 调用 print

于 2013-06-12T14:23:07.877 回答
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 回答