2015-11-07 2 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-Overloading and Overriding Concept

ответ

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.

Paragraph 12.4 Спецификация языка Java объясняет правила инициализации новых объектов и в каком порядке происходит ситуация.

+0

из конструктора базового класса, как метод из производного класса вызывается, почему бы не метод базового класса ... – Yogendra123

+2

@ Yogendra123 - Потому что это то, как работают основные работы! Все вызовы метода в классе >> и в его суперклассах << становятся вызовами метода переопределения. Единственными исключениями являются призывы к супер. '(например,' super.add') или частные методы с той же сигнатурой, которые никогда не переопределяются. –

0

При вызове конструктора поле value увеличивается на 20, когда вы вызываете метод add(). Затем вы снова вызываете метод add(), который добавляет 20 к нему, поэтому value is 20.

0

Когда подкласс, такой как ваш класс Derived, инициализируется. Он называет конструкторы своего суперкласса, в данном случае Base. Поэтому в этом случае add() вызывается дважды, как в конструкторе Base, так и в конструкторе Derived. Поскольку add() переопределяется в Derive, вызовы add() на объекте Derive дают 20. Даже если вызов был выполнен из Base, где метод add() возвращает 10.