【问题标题】:Java- Overloading and Overriding ConceptJava-重载和覆盖概念
【发布时间】:2016-02-08 13:30:38
【问题描述】:
class Base {

    int value = 0;

    Base() {
        add();
    }

    void add() {
        value += 10;
    }

    int get() {
        return value;
    }
}

class Derived extends Base {
    Derived() {
        add();
    }

    void add() {
        value += 20;
    }
}

调用派生类构造函数,然后add(),值变成40,为什么?

【问题讨论】:

    标签: java inheritance


    【解决方案1】:

    当您的 Derived 类等子类被初始化时。它调用其超类的构造函数,在本例中为 Base。所以在这种情况下 add() 被调用了两次,在 Base 的构造函数和 Derived 的构造函数中。 因为 add() 在 Derive 中被覆盖,所以对 Derive 对象的 add() 调用将产生 20。即使调用是从 Add() 方法返回 10 的 Base 内部进行的。

    【讨论】:

      【解决方案2】:

      要亲自了解到底发生了什么,您可以在调试器中运行您的代码并单步执行以查看逐步发生的情况。

      会发生这样的事情:

      1. 创建新的Derived 对象时,Base 部分中的字段value 首先初始化为0
      2. 然后调用超类Base的构造函数。这会调用add() 方法。
      3. add()方法被重写,所以调用Derived类中的版本,将20添加到value;所以value 现在是20
      4. 然后调用Derived的构造函数。这将再次调用add() 方法。
      5. 再次调用Derived 类中的add(),将20 添加到value
      6. 结果是value 包含值40

      Java 语言规范的Paragraph 12.4 解释了如何初始化新对象的规则,以及事情发生的顺序。

      【讨论】:

      • 从基类构造函数如何调用派生类的方法,为什么不基类方法...
      • @Yogendra123 - 因为这就是覆盖的工作原理!所有对类>>及其超类super.<methodName>(例如super.add)或具有相同签名且从不被覆盖的私有方法。
      【解决方案3】:

      调用构造函数时,调用add() 方法时,value 字段会增加 20。然后你再次调用add() 方法,它再次添​​加20,因此value 是20。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-05
        • 2013-04-05
        • 2022-01-10
        相关资源
        最近更新 更多