为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

拉风的咖菲猫 2021-10-13 15:40:31
我一共有三个班。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 的名称?
查看完整描述

2 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

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

返回 this 的运行时类Object

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

这也是为什么没有类必须重写getClass()才能返回正确的Class对象。(方法getClass()final反正。)


查看完整回答
反对 回复 2021-10-13
?
神不在的星期二

TA贡献1963条经验 获得超6个赞

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


查看完整回答
反对 回复 2021-10-13
  • 2 回答
  • 0 关注
  • 187 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信