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

实例字段的继承如何在此特定代码中起作用?

贺雪松
2023-03-14
问题内容
class A
{
    int a = 2, b = 3;
    public void display()
    {
        int c = a + b;
        System.out.println(c);
    }
}
class B extends A
{
    int a = 5, b = 6;
}
class Tester
{
    public static void main(String arr[])
    {
        A x = new A();
        B y = new B();
        x.display();
        y.display();
    }
}

为什么输出结果为5,5?而不是5,11吗?该y.display()方法将如何工作?


问题答案:

为什么输出结果为5,5?

因为A.display()只知道领域A.aA.b。这些是任何代码都A知道的唯一字段。您似乎希望其中的声明B“覆盖”现有的字段声明。他们没有。他们宣布
的字段 隐藏 的现有字段。变量实际上没有方法那样的行为-根本没有覆盖变量的概念。从JLS
8.3节开始

如果类声明了具有特定名称的字段,则称该字段的声明 隐藏 了超类和该类的超接口中所有相同名称的字段的所有可访问声明。

您可以通过更改B使其构造函数更改其继承的现有字段的值来获得所需的效果A

class B extends A {
    B() {
        a = 5;
        b = 6;
    }
}

请注意,这些 不是
变量声明。它们只是任务。当然,在大多数代码(无论如何,我已经看过的大多数代码)中,这些字段A都是私有的,因此无法从中进行访问B,但这只是示例,旨在解释语言行为。



 类似资料:
  • 本文向大家介绍Python class的继承方法代码实例,包括了Python class的继承方法代码实例的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Python class的继承方法代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 运行结果: 还可以写成: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支

  • 本文向大家介绍Javascript中3种实现继承的方法和代码实例,包括了Javascript中3种实现继承的方法和代码实例的使用技巧和注意事项,需要的朋友参考一下 继承是我们在实现面向对象编程的时候很重要的一个手段。虽然我们讲不能过度继承,多利用组合代替继承,但是继承总是免不了的。这里要讨论的就是Javascript中的继承机制。 Javascript中实际上是没有继承的概念的,但是我们可以通过一

  • 问题内容: 当超类具有标记为final的字段但子类覆盖(隐藏?)此字段时,会发生什么?“最终”并没有阻止它,不是吗?我正在处理的特定示例是Building类,从中继承了各种建筑物。除其他事项外,每种类型的成本对于每个子类都应是最终成本,但是每种类型的建筑物应具有自己的成本。 编辑:从那以后,我意识到我不知道上面我在说什么。我真正想要的是成本的静态变量。但是,如果我在超类中声明这些静态变量,则它们对

  • 问题内容: 我无法理解以下输出。 我不知道为什么输出为10,我认为该行创建了B类的新实例,我认为结果应为20 为什么这样工作..请解释。 问题答案: 首先,请参见 隐藏字段 (添加了重点) 在一个类中,与超 类中的字段 同名的字段会 隐藏超类的字段 ,即使它们的类型不同 换句话说,这是不是“遗产”,因为你实际上隐藏的背后的,和你正在使用的参考对象,所以你得到它的领域。如果这样做了,您将看到预期的效

  • 问题内容: null在此代码中如何工作,为什么不打印对象? 输出: 在字符串中 问题答案: Java将始终尝试使用方法的最特定版本。 自通话以来 适用于两种方法 Java将选择最具体的方法描述,即

  • 问题内容: 我正在使用Flask和SQLAlchemy。我使用了自己的抽象基类和继承。当我尝试在python shell中使用模型时,出现以下错误: 我该如何解决? 码: manage.py: init.py: database.py: models.py: controllers.py: 问题答案: 尝试添加 在你的User类下