从子类对象使用超类的getClass方法

时间:2018-09-26 19:57:15

标签: java oop inheritance polymorphism

我总共有三节课。主要,动物(超类)和猫(子类)。 当我尝试调用whatIsTheClass()方法时,我不理解输出“ Cat”。我期待看到输出“动物”。之所以期望输出“动物”,是因为我相信从动物对象而不是猫对象调用方法whatIsTheClass(),因为子类不包含此方法。

主类:

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对象中查找被调用的方法。并且,如果在Superclass对象中定义了to方法的调用,则会从那里调用它。在这种情况下,因为子类没有定义它自己的whatIsTheClass()方法,所以它必须使用在超类对象中定义的whatIsTheClass()方法。但是,如果从超类对象调用whatIsTheClass(),为什么它返回子类的名称而不是超类的名称?

2 个答案:

答案 0 :(得分:1)

方法whatIsTheClass可以在Animal中定义,但是调用类代码getClass()的方法没有区别。如Javadocs for getClass()中所述,所有内容都与对象的运行时类型有关:

  

返回此Object的运行时类。

cat指定的对象的运行时类型为Cat

这也是为什么没有类必须重写getClass()来返回正确的Class对象的原因。 (方法getClass()仍然是final。)

答案 1 :(得分:0)

创建Cat类的对象时,超类的所有方法和字段的副本将在该对象中获取内存。这就是为什么通过使用子类的对象,您还可以访问超类的成员。 请注意,在继承期间仅创建子类的对象,而不创建超类的对象。