Java-重载和覆盖概念

时间:2015-11-07 13:06:49

标签: java inheritance

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.为什么?

3 个答案:

答案 0 :(得分:3)

要自己找出正在发生的事情,您可以在调试器中运行代码并逐步执行以查看一步一步发生的事情。

这就是:

  1. 当您创建新的Derived对象时,value部分中的字段Base首先会初始化为0
  2. 然后调用超类Base的构造函数。这会调用add()方法。
  3. 覆盖了add()方法,因此调用了类Derived中的版本,将20添加到value;所以value现在是20
  4. 然后调用Derived的构造函数。这会再次调用add()方法。
  5. 再次调用班级add()中的Derived,将20添加到value
  6. 结果是value包含值40
  7. Java语言规范的

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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