我试图对子类如何访问超类的方法和字段进行一些研究。当我在 stackoverflow 上阅读解释继承“真正”如何工作的帖子时,我对看到我的输出感到困惑。
看完这篇文章后,这是我对继承的理解,如果有错误,请您纠正:
方法和字段不会复制到子类,而是从超类对象调用,除非在子类中被覆盖。我已经使用javap命令确认方法和字段没有被复制到子类。
当调用子类中的方法时,它会在运行时查找子类对象中的方法(一种可能的覆盖方法),如果没有找到,它将在层次结构中上升到超类对象中,然后从超类对象。
因为方法和字段不是复制到子类而是从超类对象调用,所以子类构造函数调用 super(); 隐式地确保有一个 Superclass 对象可用于调用继承的方法。
应用我刚刚写下的逻辑,我遇到了一些奇怪的输出。在下面的示例中,我有 A 类(Superclass)和 B类(Subclass)。我从 Main 方法接收 B 作为输出,但期望 A 作为输出。
A类:
public class A {
public void getTheClass() {
System.out.println(getClass().getSimpleName());
}
}
B类:
public class B extends A {
public B() {
getTheClass();
}
}
班级主要:
public class Main {
public static void main(String[] args) {
B b = new B();
}
}
我期望 A 作为输出的原因是因为(根据前面描述的逻辑)getTheClass()方法将从超类对象 (A) 中调用,因为子类对象 (B) 没有名为 getTheClass() 的方法. Subclass 对象没有这个方法是因为根据我的理解,方法和字段并没有复制到子类中。
如果子类没有这个方法,它将在层次结构中向上搜索一个对象,并从那里调用它,在这种情况下就是超类对象 (A)。因此,如果从超类对象(A)调用getTheClass()方法,那么对象的类不就是类 A 而不是类 B 吗?在那种情况下,为什么它不输出 A 而是输出 B?如果我打印出关键字this ,我会得到同样令人困惑的结果。
慕森卡
相关分类