【发布时间】:2018-09-26 19:57:14
【问题描述】:
我一共有三门课。主要、动物(超类)和猫(子类)。 当我尝试调用 whatIsTheClass() 方法时,我不理解输出“Cat”。我期待看到输出“动物”。我期望输出“Animal”的原因是因为我相信方法 whatIsTheClass() 是从 Animal 对象而不是 Cat 对象调用的,因为 Subclass 不包含此方法。
主类:
package com.example.java;
public class Main {
public static void main(String[] args) {
Animal cat = new Cat();
}
}
猫类:
package com.example.java;
public class Cat extends Animal {
public Cat() {
super();
whatIsTheClass();
}
}
动物类:
package com.example.java;
public class Animal {
public void whatIsTheClass() {
System.out.println(this.getClass().getSimpleName());
}
}
我的理解是在继承中,子类不会复制超类的方法。如果 Subclass 对象中没有定义被调用的方法,它将在 Superclass 对象中查找被调用的方法。如果被调用的方法是在超类对象中定义的,它将从那里被调用。在这种情况下,由于子类没有定义它自己的 whatIsTheClass() 方法,它必须使用在超类对象中定义的 whatIsTheClass() 方法。但是如果从超类对象调用whatIsTheClass(),为什么返回的是子类的名字而不是超类的名字呢?
【问题讨论】:
-
你的理解有误。这根本不是多态性的工作原理。你的对象是一只猫。 Cat 从其超类继承
whatIsTheClass方法。this是当前对象,当前对象是一只猫(因为你是使用new Cat()创建的),所以它的类是猫。创建 Cat 时,您会创建一个 single 对象。这个对象是一只猫,也是一只动物(因为猫扩展了动物)。您不会创建两个对象。 -
我知道“Animal cat = new Cat();”中所述的对象作为一个 Cat 对象。我正在创建两个对象,因为我正在调用 Super();第二个对象是超类对象。
标签: java oop inheritance polymorphism