gpt4 book ai didi

java - 确定实际调用哪个重写方法

转载 作者:行者123 更新时间:2023-12-01 07:01:53 24 4
gpt4 key购买 nike

例如,当子类对象转换为其父类(super class)时

Superclass obj = new Subclass();

并且定义了类

public class Superclass{
public void thisMethod(){
System.out.println("Superclass version was executed");
}

public class Subclass extends Superclass{
public void thisMethod(){
System.out.println("Subclass version was called");
}
public void newMethod(){
System.out.println("blah");
}
}

当调用obj.thisMethod()时,我得到调用子类版本作为输出,这显然意味着在子类中定义的该方法的版本(原始父类(super class)对象无法“执行”的版本)被调用,尽管声明的类型是父类(super class),是吗?因此,即使子类方法是在 obj 上执行的,当调用 obj.newMethod() 时,我收到编译错误。

基本上,为什么子类中定义的 thisMethod() 版本是通过父类(super class)对象 obj 调用的?我知道 obj 的实际类型仍然是 Subclass,所以自然地,应该调用新版本,但是,我不应该能够调用 obj.newMethod()?

感谢您的任何解释(:

编辑:标题中的意思是被覆盖*

最佳答案

Basically, why is the version of thisMethod() defined in the subclass being invoked through the Superclass object obj?

因为这基本上是继承的要点 - 它允许重写实现,而调用代码不需要知道正在使用哪个实现。以 InputStream 为例 - 您可以使用 InputStream 进行编码,然后无论您传递的是 FileInputStreamByteArrayInputStream 等。对于抽象类或接口(interface),您可能会调用在编译时类型中没有任何实现的方法 - 但可以保证'将是执行时使用的具体对象类型的实现。

I understand that the actual type of obj is still Subclass, so naturally, the new version should get called, but then, shouldn't I be able to call obj.newMethod()?

不,因为 obj编译时类型是Superclass。区分变量的编译时类型(决定哪些方法等可用)和对象的执行时类型非常重要,该类型决定变量的值指的是,它决定了实际调用哪些方法实现。

这只是一个非常简短的描述 - 您应该阅读一本优秀的 Java 书籍中有关继承的章节以了解更多详细信息。

关于java - 确定实际调用哪个重写方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44472292/

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