【发布时间】:2018-09-27 04:21:03
【问题描述】:
我尝试对子类如何访问超类的方法和字段进行一些研究。 当我在 stackoverflow 上阅读解释继承“真正”如何工作的帖子时,我很困惑地看到我的输出。我看到的帖子是:What really happens on inheritance in Java?
看完这篇文章,这是我对继承的理解,如有错误请大家指正:
- 方法和字段不会复制到子类,而是从超类对象调用,除非在子类中被覆盖。我已经确认没有使用 javap 命令将方法和字段复制到子类中。
- 在调用子类中的方法时,它会在运行时查找子类对象中的方法(可能的覆盖方法),如果找不到,它将在层次结构中向上查找超类对象中的方法,然后调用它来自超类对象。
- 因为方法和字段没有复制到子类,而是从超类对象调用,所以子类构造函数调用 super();隐式地确保有一个超类对象可用于调用继承的方法。
应用我刚刚写下的逻辑,我遇到了一些奇怪的输出。在下面的示例中,我有 A 类(超类)和 B 类(子类)。我从 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 对象没有此方法,因为根据我的理解,方法和字段不会复制到 Subclasses。
如果子类没有这个方法,它将在层次结构中向上搜索一个对象并从那里调用它,在这种情况下是超类对象(A)。那么如果从超类对象(A)调用getTheClass()方法,那么该对象的类不就是A类而不是B类吗?在那种情况下,为什么它不输出A而是输出B?如果我打印出关键字 this,我会得到同样令人困惑的结果。
【问题讨论】:
-
getClass()返回对象的运行时类。 -
补充其他人所说的,getClass() 本身继承自java 中的Object 基类。所以根据你的推理 getClass 不会返回 A 但会返回 Object.
-
你已经构造了 B 类 [ new B() ],A 类只是将它的字段和方法分享给它的孩子。要让它输出类 A,你需要构造 A。
标签: java class oop inheritance