猿问

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

我一共有三个班。Main、Animal(超类)和 Cat(子类)。当我尝试调用 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 对象中寻找被调用的方法。如果在 Superclass 对象中定义了被调用的方法,它将从那里调用。在这种情况下,因为子类没有定义它自己的 whatIsTheClass() 方法,它必须使用在 Superclass 对象中定义的 whatIsTheClass() 方法。但是如果 whatIsTheClass() 是从 Superclass 对象调用的,为什么它返回的是 Subclass 的名称而不是 Superclass 的名称?


拉风的咖菲猫
浏览 188回答 2
2回答

皈依舞

方法whatIsTheClass可以在 中定义Animal,但在哪个类的代码getClass()中调用没有区别。这完全与对象的运行时类型有关,如Javadocs for 中所述getClass():返回 this 的运行时类Object。由 指定的对象的运行时类型cat是Cat。这也是为什么没有类必须重写getClass()才能返回正确的Class对象。(方法getClass()是final反正。)

神不在的星期二

当创建 Cat 类的对象时,超类的所有方法和字段的副本将在该对象中获取内存。这就是为什么通过使用子类的对象,您还可以访问超类的成员。请注意,在继承过程中,只会创建子类的对象,而不是超类。
随时随地看视频慕课网APP

相关分类

Java
我要回答