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

关于第二个查询:t.isClawedBy(t)给出Clawed by Cat.

由于tis aKitten并且方法中传递的参数t.isClawedBy(t)也是,因此将调用Kitten超类中的方法,因为它与参数完美匹配。Cat

于 2013-06-10T03:28:06.850 回答
0

类 Kitten 不会覆盖isClawedBy(Cat c)。它增加了一个新方法isClawedBy(Kitten c)。运行时在调用时将s引用视为 a ,并最终调用 Cat 方法。Cats.isClawedBy(t)

如果您将小猫更改为:

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 回答
0

我对为什么 s.isClawedBy(t) = Clawed by Cat 感到困惑。由于 s 的动态类型是一只小猫,而 t 是一只小猫。

s 具有引用类型Cat,但拥有一个Kitten对象。t 具有引用类型Kitten并包含一个 object Kitten。当方法在运行时运行时,首先检查引用类型是否具有这样的方法,然后调用该方法的最具体版本。由于子类不会覆盖方法(参数中的不同类型),因此会调用引用类型中的方法。

对于您的第二部分,发生的事情完全相同,没有重载,并且确实可以将 Kitten 作为 Cat 传递给引用类型中的方法,因此该方法再次是层次结构中最具体的方法,并且被调用。

于 2013-06-10T03:40:56.427 回答
0

至于第一个问题;

重载决议是在运行时完成的,但重载决议是在编译时完成的。
由于您的方法的签名不相同(不同的参数类型。一个是另一个的子类并不重要),它们正在重载。

由于在编译时解析,编译器不知道实例类型是什么;只有声明的类型。
对编译器来说,s.isClawedBy(t)声明类型isClawedBy(Kitten)的方法。 编译器说“是的,Cat 可以在它的方法中接受一只小猫,这就是这个方法”。 因此,在运行时,编译器已经选择了将调用的方法。查找不在运行时执行。 Cat

因此,在运行时,尽管s实际上是一个 Kitten 对象,但调用了 Cat 方法。

于 2013-06-10T04:32:17.797 回答