首页 > 解决方案 > 从子类对象使用超类的 getClass 方法

问题描述

我一共有三个班。主要、动物(超类)和猫(子类)。当我尝试调用 whatIsTheClass() 方法时,我不理解输出“Cat”。我期待看到输出“动物”。我期望输出“Animal”的原因是因为我相信方法 whatIsTheClass() 是从 Animal 对象而不是 Cat 对象调用的,因为子类不包含此方法。

主类:

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(),为什么它返回的是子类的名称而不是超类的名称呢?

标签: javaoopinheritancepolymorphism

解决方案


该方法whatIsTheClass可以在 中定义Animal,但在哪个类的代码getClass()中调用没有区别。这完全是关于对象的运行时类型,如Javadocs 中getClass()所述:

返回 this 的运行时类Object

由 指定的对象的运行时类型catCat

这也是为什么没有类必须重写getClass()只是为了返回正确的Class对象。(无论如何,方法getClass()是。)final


推荐阅读