gpt4 book ai didi

Java - 理解继承的问题

转载 作者:行者123 更新时间:2023-12-01 09:14:36 25 4
gpt4 key购买 nike

我面临一些关于 Java 继承的问题。我不明白为什么以下两个程序有这些输出!有人可以帮助我吗? :)

1)

public class A {
int foo() {
return 1;
}
}

public class B extends A {
int foo() {
return 2;
}
}

public class C extends B {
int bar(A a) {
return a.foo();
}
}

C x = new C();
System.out.println(x.bar(x));

// OUTPUT:2

2)

public class A {
int e=1;
}

public class B extends A {
int e=2;
}

public class C extends B {
int bar(A a){
return a.e;
}
}

C x= new C();
System.out.println(x.bar(x));

// OUTPUT:1

最佳答案

在这两种情况下,您都会传入 C 类型的对象。进入打印功能。 bar函数请求 A 类型的对象,但传入 C 类型的对象仍然可以接受因为它是 A 的子类。因此,首先,请务必记住 a.foo()a.e正在调用 C对象。

因此,在这两种情况下,它都会搜索列表中最低的属性或方法。下面是 Java 在第 1 部分中所做的事情的非常简化的版本:

  1. 嘿,您传入了 C 类型的对象到bar方法!现在我们将其称为 foo方法。
  2. 哎呀! C没有foo方法!让我们继续下一步,直到 B类来查看它是否有 foo方法。
  3. 耶! B有一个foo方法,所以我们就这样调用它。无需一直到 A类,因为我们已经在 B 中找到了我们需要的内容。

这一切都是为了理解该参数是从 A 向下转换的至C 。第 2 部分使用了完全相同的逻辑。它注意到 C 类型的对象被传入,所以它得到 e对象的属性 B因为它是包含该属性的层次结构中的最低类。

希望这能回答您的问题!

关于Java - 理解继承的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40657609/

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