当前位置: 首页 > 面试题库 >

Java方法重载和变量阴影

史弘博
2023-03-14
问题内容
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()方法)。但是我不明白为什么cr是100,而c.getR()是10(我很难理解当您像上面的代码那样键入到祖先类时继承发生了什么)。


问题答案:

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



 类似资料:
  • 问题内容: 看到以下代码的输出,我感到很惊讶: 它输出 为什么会这样呢? 我以为该代码不会编译,因为对的调用是 模棱两可的 ,但它运行良好并可以输出。 如果我将代码修改为: 没有错误消息。 为什么第一个代码可以正常运行,但是第二个却给出错误? 问题答案: 此行为是由于与和之间没有这种比较相比,它更具体。 如JLS 第15.12.2.5节(强调我的)中所述: 如果满足以下任一条件,则使用参数表达式e

  • Java 允许同一个类中定义多个同名方法,只要它们的形参列表不同即可。 如果同一个类中包含了两个或两个以上方法名相同的方法,但形参列表不同,这种情况被称为方法重载(overload)。 例如,在 JDK 的 java.io.PrintStream 中定义了十多个同名的 println() 方法。 这些方法完成的功能类似,都是格式化输出。根据参数的不同来区分它们,以进行不同的格式化处理和输出。它们之

  • 我正在Java中练习一些例子。代码如下所示: 关于这一点,我没有什么问题, 1) 上面的代码使用method1(算术异常e)执行并打印null,为什么不使用异常(因为它位于层次结构的顶部)? 猜测:这是因为与异常相比,算术异常更加具体。如果是这样,为什么要问第二个问题 2) 通过在现有代码中引入以下方法,程序显示编译时异常。为什么? 帮助我学习。谢谢

  • 问题内容: 我正在学习Java。我对继承有疑问。当子类扩展父类并且父类具有引用在父类中声明的实例变量的方法时。但是子类dint覆盖了此方法,并声明了与父类同名的实例变量。在这种情况下,将引用来自child的实例变量或将引用parent的实例变量。下面是代码片段 我得到的输出是 在孩子 10的父母中 有人可以让我理解为什么它引用父类的实例变量而不是子类的实例变量。 另一个疑问是,当父类和子类中有静态

  • 如何使像这样打印: 在调试过程中,我曾在许多地方将许多打印语句作为日志编写。我会写这样的声明 我想要一个打印变量名和变量值的方法。在C中,可以按如下方式进行: 有什么办法可以做到这一点吗? 提前感谢。

  • 问题内容: 这是我遇到的一个测试练习问题,希望您能帮助我理解概念 让Hawk成为Bird的子类。假设某个类有两个重载的方法void foo(Hawk h)和void foo(Bird b)。在声明Bird x = new Hawk()之后,将在调用foo(x)中执行哪个版本; 这是我到目前为止的代码,有人可以向我解释为什么foo(bird b)被执行吗? 问题答案: Java执行重载解析以选择方法