2015-11-07 38 views
-9
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-超载和重载概念

回答

3

要了解自己究竟发生了什么,可以在调试器中运行代码并逐步了解它一步一步发生。

这是发生了什么:

  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

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

+0

方法从派生类被调用,为什么不基类方法... – Yogendra123

+2

@ Yogendra123 - 因为这是如何压倒一切的作品!所有对类中的方法和其超类中的方法的调用都成为对override方法的调用。唯一的例外是调用super。 '(例如'super.add')或具有相同签名且永不被覆盖的私有方法。 –

0

当您调用构造函数时,当您调用add()方法时,value字段会增加20。然后您再次调用add()方法,这又增加了20个方法,因此,value是20.

0

当您的Derived类等子类被初始化时。它调用它的超类的构造函数,在这种情况下是Base。所以在这种情况下,add()被调用两次,既在Base的构造函数中,也在Derived的构造函数中调用。 由于在派生中add()被覆盖,因此对派生对象的add()调用将产生20.即使该调用是从Base中进行的,其中add()方法返回10.基类构造函数中的