【问题标题】:Inheritance in java had confusing output [duplicate]java中的继承具有令人困惑的输出[重复]
【发布时间】:2017-05-06 19:43:39
【问题描述】:

我已经提出了这个问题:

public class A {

    private void a() {
        System.out.println("a");
    }

    public static void main(String[] args) {
        A t = new B();
        t.a();
    }
}


class B extends A {
    public void a() {
        System.out.println("b");
    }
}

这会打印输出:a

我不太确定答案。 我知道如果您创建一个子对象并将其传递给父引用。它运行仅通过 A 覆盖的功能。 但是这里的函数是私有的,这是怎么工作的???

我知道这不是压倒一切的。但是输出怎么会打印“a”呢?

【问题讨论】:

  • 您不能覆盖private 方法。
  • a() 是 A 上的私有函数,不会被继承。
  • 私有方法不被继承
  • 你在这里并没有真正覆盖a(),因为它是私有的,你的B对象将无法调用它。
  • 我并不是说它压倒一切。我是说因为它没有压倒一切,为什么它打印“a”

标签: java inheritance


【解决方案1】:

虽然父类和子类都有方法a(),但它不是方法覆盖,因为父类A中的a()是私有的。

私有方法在类外不可见,甚至在它的子类中也不可见。这里B类不知道父类中存在同名方法。

所以当你调用A类引用的a()时,它会调用A类的方法,而不是它的子类B的方法。

如果您将 A 类中方法 a() 的修饰符更改为 public、protected 或 default,那么您可以看到方法覆盖行为。它会打印'b'

【讨论】:

  • 但是您创建的对象属于 b 而不是 A。这意味着 A 的私有成员可以通过 B 的对象访问。这听起来不对。
  • 没有。您不能使用 B 类对象访问 A 类的私有成员。在您的情况下,编译器将 a() 视为 A 类而不是 B 类的方法。
  • 如果你要从B类中删除方法a(),然后编写代码:B b = new B(); b.a();它不会编译。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-21
  • 2010-10-03
  • 2013-07-20
  • 1970-01-01
  • 1970-01-01
  • 2019-07-11
相关资源
最近更新 更多