gpt4 book ai didi

Java 方法覆盖和变量阴影

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:07:06 24 4
gpt4 key购买 nike

public class Circle {
public float r = 100;
public float getR() {
return r;
}
}

public class GraphicCircle extends Circle {
public float r = 10;
public float getR() {
return r;
}

// Main method
public static void main(String[] args) {
GraphicCircle gc = new GraphicCircle();
Circle c = gc;
System.out.println("Radius = " + gc.r);
System.out.println("Radius = " + gc.getR());
System.out.println("Radius = " + c.r);
System.out.println("Radius = " + c.getR());
}

}

您好,我无法理解上面代码的输出。输出是:

Radius = 10.0
Radius = 10.0
Radius = 100.0
Radius = 10.0

我理解为什么gc.r是10。我也理解为什么gc.getR()是10(因为GraphicCircle中的getR()方法覆盖了Circle的getR()方法)。但我不明白为什么 c.r 是 100,而 c.getR() 是 10(当您像上面的代码那样对祖先类进行类型转换时,我无法理解继承中发生的情况)。

最佳答案

方法调用在 Java 中是虚拟的,这意味着调用对象实际类型的方法,而不管您用来访问对象的引用是什么类型。另一方面,直接字段访问不是虚拟的,因此您访问哪个 r 将取决于您访问它所通过的引用类型。

关于Java 方法覆盖和变量阴影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25847300/

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