gpt4 book ai didi

java - 对Java中继承方法和字段的困惑

转载 作者:行者123 更新时间:2023-11-30 02:02:03 25 4
gpt4 key购买 nike

我尝试对子类如何访问父类(super class)的方法和字段进行一些研究。当我在 stackoverflow 上读到一篇解释继承“真正”如何工作的文章时,我很困惑地看到我的输出。我读的帖子是:What really happens on inheritance in Java?

读完这篇文章后,这是我对继承的理解,如有错误还请指正:

  • 方法和字段不会复制到子类,而是从父类(super class)对象调用,除非在子类中重写。我已确认方法和字段未使用 javap 命令复制到子类。
  • 当调用子类中的方法时,它会在运行时查找子类对象中的方法(可能的重写方法),如果没有找到,它将在层次结构中向上查找父类(super class)对象中的方法,然后调用它来自父类(super class)对象。
  • 由于方法和字段不会复制到子类,而是从父类(super class)对象调用,因此子类构造函数调用 super();隐式地确保有一个父类(super class)对象可用于调用继承的方法。

应用我刚刚写下的逻辑,我遇到了一些奇怪的输出。在下面的示例中,我有 A 类(父类(super class))和 B 类(子类)。我收到了 B 作为 Main 方法的输出,但实际上期望 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 作为输出的原因是因为(根据前面描述的逻辑)将从父类(super class)对象 (A) 作为子类对象 (B) 调用 getTheClass() 方法) 没有名为 getTheClass() 的方法。 Subclass对象没有这个方法,因为根据我的理解,方法和字段不会复制到Subclasses中。

如果子类没有此方法,它将在层次结构中向上搜索具有此方法的对象并从那里调用它,在本例中该对象是父类(super class)对象 (A)。因此,如果从父类(super class)对象 (A) 调用 getTheClass() 方法,那么该对象的类不是 A 类而不是 B 类吗?既然如此,为什么不输出A而是B呢?如果我打印出关键字 this,我会得到同样令人困惑的结果。

最佳答案

Because it goes up in hierarchy when a called method is not found in a Subclass object, the Subclass constructor calls super(); implicitly to make sure there's a Superclass object available to call inherited methods from.

构造函数(在子级和父级中)将在您创建对象本身时调用,而不是在您调用对象上的方法时调用(因为您需要一个完全构造的对象来调用其上的方法)。

您看不到打印的类名称为 A 的原因是 getClass() 方法返回 runtime 类型对象(B)

来自javadoc ,(强调我的)

Returns the runtime class of this Object. The returned Class object is the object that is locked by static synchronized methods of the represented class.

引用:

What is a "runtime class" in Java?

关于java - 对Java中继承方法和字段的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52529402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com