我一共有三门课。主要,动物(父类(super class))和猫(子类)。 当我尝试调用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());
}
}
我的理解是,在继承中,子类不会复制父类(super class)的方法。如果子类对象中没有定义被调用的方法,则会在父类(super class)对象中查找被调用的方法。如果调用的方法是在父类(super class)对象中定义的,则将从那里调用该方法。在这种情况下,因为子类没有定义它自己的whatIsTheClass()方法,所以它必须使用父类(super class)对象中定义的whatIsTheClass()方法。但是如果从父类(super class)对象调用whatIsTheClass(),为什么它返回子类的名称而不是父类(super class)的名称?
最佳答案
方法 whatIsTheClass
可以在 Animal
中定义,但在哪个类的代码中调用 getClass()
没有区别。这一切都与对象的运行时类型有关,如 Javadocs for getClass()
中所述。 :
Returns the runtime class of this
Object
.
cat
指定的对象的运行时类型是Cat
。
这也是为什么没有类必须重写 getClass() 才能返回正确的 Class 对象。 (无论如何,getClass()
方法是final
。)
关于java - 从子类对象使用父类(super class)的 getClass 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52525209/