gpt4 book ai didi

java - 为什么调用基类方法?

转载 作者:行者123 更新时间:2023-11-29 05:14:55 25 4
gpt4 key购买 nike

在下面的代码中:

b.show("str");
//prints: from base
d.show("");
//prints: from str

可以解释一下为什么它的行为不同吗?我想知道为什么 Base b = new Sub(),会调用来自基类的 b.show()。我只是使用 DifferentClass,作为引用,显示在非继承情况下调用了 b.show(String)。

public class TestClass {

public static void main(String[] args) {
Base b = new Sub();
b.show("str");
DifferentClass d = new DifferentClass ();
d.show("");
}
}

class Base {
public void show(Object obj) {
System.out.println("from base");
}
}

class Sub extends Base {
public void show(String str) {
System.out.println("from sub");
}
}

class DifferentClass {
public void show(String str) {
System.out.println("from str");
}

public void show(Object obj) {
System.out.println("from obj");
}
}

最佳答案

因为引用类型。

    Base b = new Sub();
b.show("str");
Sub2 s2 = new Sub2();
s2.show("");

在该代码中,虽然bSub的一个实例,但是变量的引用类型是Base。方法重载是在编译时评估的,而不是运行时。这很重要,因为在编译时,一旦 new Sub() 构造函数运行并且我们分配变量,编译器就不再知 Prop 体类。只有它是一个有效的 Base

为什么这很重要?

因为当编译器尝试解析 b.show(String) 时,Base 上没有方法(它唯一确定的 类型) b) 接受一个 String,因此它将字符串传递给 show(Object) 方法。

Sub 不会覆盖 show(String) 方法(尽管 Sub2 会)。

顺便说一句,@Override 注释将帮助您解决这个问题:When do you use Java's @Override annotation and why?

关于java - 为什么调用基类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26946786/

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