【问题标题】:Why is class extension calling private method of original class? [duplicate]为什么类扩展调用原始类的私有方法? [复制]
【发布时间】:2019-04-19 14:47:59
【问题描述】:

在这段代码中:

public abstract class Bird {
    private void fly() {
        System.out.println("Bird is flying");
    }

    public static void main(String[] args) {
        Bird bird = new Pelican();
        bird.fly();
    }
}

class Pelican extends Bird {
    protected void fly() {
        System.out.println("Pelican is flying");
    }
}

请解释为什么这个输出是“Bird is fly”,因为私有成员没有被继承,而且我在 Bird 中有一个 Pelican 实例?

【问题讨论】:

  • 您不能覆盖private 方法。出于某种原因,我对这个编译完全感到惊讶。
  • 你没有覆盖继承类的 fly 方法。
  • 这不是关于我是否覆盖某些东西,而是关于 Pelican 实例如何获取其父级的私有代码...
  • 总结我假设的所有 cmets - Bird 引用不会让 Pelican 实例到达他自己的方法 fly(),只是因为 main() 方法放在 Bird-class 私有 Bird-class 方法 fly()被调用。此外,如果父类中的访问修饰符将受到保护,则将覆盖父方法并调用子版本。我说的对吗?

标签: java


【解决方案1】:

当引用类型是 Bird 时,对象只能访问类 Bird 中的方法,尽管它是 Pelican 类型。引用类型总是意味着一个约束并且不能访问例如字段。子类。

【讨论】:

  • 引用分配给鹈鹕
  • Bird bird = new Pelican(): bird 是对对象的引用,它的类型是 Bird。 Pelican 是存储在内存中的对象的类型。引用和对象是有区别的。
  • 是的 bird 被定义为 Bird,但这不是多态性通常的工作方式。在这种情况下,它确实是因为基类的方法被定义为private,但这不是常态。如果该方法是publicprotected,即使bird 被定义为Bird,它也会打印Pelican is flying
  • 我明白你在说什么。很抱歉,我会删除以避免进一步混淆。
  • 概念 1:- 当您创建私有方法时,它只能在类中访问。它不能继承。概念 2:- 这里的代码 private void fly() { System.out.println("Bird is fly"); } 不能继承。所以Pelican 类中的代码不会被继承,它被视为Pelican 类自己的方法。 protected void fly() { System.out.println("鹈鹕在飞"); }
猜你喜欢
  • 2013-07-02
  • 2011-07-09
  • 2015-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多