我总共有三节课。主要,动物(超类)和猫(子类)。 当我尝试调用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(),为什么它返回子类的名称而不是超类的名称?
答案 0 :(得分:1)
方法whatIsTheClass
可以在Animal
中定义,但是调用类代码getClass()
的方法没有区别。如Javadocs for getClass()
中所述,所有内容都与对象的运行时类型有关:
返回此
Object
的运行时类。
由cat
指定的对象的运行时类型为Cat
。
这也是为什么没有类必须重写getClass()
来返回正确的Class
对象的原因。 (方法getClass()
仍然是final
。)
答案 1 :(得分:0)
创建Cat类的对象时,超类的所有方法和字段的副本将在该对象中获取内存。这就是为什么通过使用子类的对象,您还可以访问超类的成员。 请注意,在继承期间仅创建子类的对象,而不创建超类的对象。