gpt4 book ai didi

java - 解释变量隐藏在这个 Java 代码中是如何工作的

转载 作者:IT老高 更新时间:2023-10-28 20:47:08 24 4
gpt4 key购买 nike

考虑下面的代码

class A
{
int x = 5;
void foo()
{
System.out.println(this.x);
}
}
class B extends A
{
int x = 6;
// some extra stuff
}
class C
{
public static void main(String args[])
{
B b = new B();
System.out.println(b.x);
System.out.println(((A)b).x);
b.foo();
}
}

程序的输出是

6
5
5

我理解前两个,但无法理解最后一个。 b.foo() 如何打印 5. B 类会继承 foo 方法。但它不应该打印 b.x 会打印的内容吗?这里到底发生了什么?

最佳答案

是的,B 类继承了 foo 方法。但是B中的变量x隐藏了A中的x;它不会取代它。

这是范围问题。 A 中的 foo 方法只能看到范围内的变量。范围内的唯一变量是 A 中的实例变量 x

foo 方法在 B 中被继承,但未被覆盖。如果您要使用相同的确切代码显式覆盖 foo:

class B extends A
{
int x = 6;

@Override
void foo()
{
System.out.println(this.x);
}
}

那么当被 this.x 引用时,在范围内的变量将是 Bx 6 将被打印。虽然方法的文本是相同的,但由于范围的原因引用是不同的。

顺便说一句,如果你真的想在B类中引用Ax,你可以使用super。 x.

关于java - 解释变量隐藏在这个 Java 代码中是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51106740/

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