gpt4 book ai didi

java - Java 中的继承

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:55:40 26 4
gpt4 key购买 nike

我在网上遇到了这个关于继承的例子,我对它的结果并不容易。我遗漏了一些关键的东西。

public class A {

int i = 5;

public A() {
foo();
}

private void foo() {
System.out.println(i);

}}

public class B extends A {
int i = 6;}

public class C extends B {
int i = 7;

public void foo() {
System.out.println("C's foo");
System.out.println(super.i);
}}

我试图通过以下命令弄清楚发生了什么:C c = new C();
System.out.println(C.i);

我知道当我们创建 C 的新实例时,我们接近 A 和 B 的构造,所以我们到达 A() -(问题 1)i (A 的)在途中被初始化?现在我们需要调用 foo()-(问题 2)- C 的 foo() 是否被视为 A 的 foo() 的覆盖?如果 B 本身有一个 foo() 怎么办?然后它被认为是覆盖并且操作了C的foo()

据我所知,涉及局部变量时没有覆盖。为什么 System.out.println(c.i) 是 7 而不是 5?不应该是最高父亲的i吗?

编辑:我的问题不是关于当我使用 c 时将使用哪个 foo 和 i,而是关于在这两个特定命令期间发生的事情,因为显然使用了 A 的 foo 而不是 C 的。

非常感谢。

最佳答案

这里的三个 i 变量是完全独立的。任何语句使用哪一个是在编译时 确定的 - 不涉及多态性。所以 A.foo() 将始终打印出在 A 中声明的变量的值。

请注意,顺便说一下,这些不是本地变量 - 它们是实例变量。

当您打印出 c.i 时,它使用了在 C 中声明的变量,因为 c 的编译时类型是 C。如果你写:

C c = new C();
A a = c;
B b = c;
System.out.println(a.i); // 5 - variable declared in A
System.out.println(b.i); // 6 - variable declared in B
System.out.println(c.i); // 7 - variable declared in C

请注意,在编写良好的程序中,这种事情几乎不会引起问题,因为变量应该是私有(private)的。

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

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