2015-11-07 68 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.基類構造函數中的