2012-05-13 1 views
0

По runnung следующего кода, который я получил результат:

метод из класса А
метод из класса В.Почему вызов конструктора метода overriden вместо одного из его класса?

public class Test { 

    static class A { 

     public A() { 
      someMethod(); 
     } 

     public void someMethod() { 
      System.out.println("method from class A"); 
     } 
    } 

    static class B extends A { 
     public void someMethod() { 
      System.out.println("method from class B"); 
     } 
    } 

    public static void main(String... args) { 
     new A(); 
     new B(); 
    } 
} 

Первая строка результата ясно, но второй один не является. Почему конструктор класса А не назвал метод, определенный в классе А, переопределенным методом класса В? Может быть, после компиляции код из конструктора A каким-то образом скопирован в класс B, чтобы мы фактически назовем наш метод из класса B?

+0

Это существенное различие между Java и C++. C++ ведет себя так, как вы ожидаете. Java нет. Почему бы вам не спросить Джеймса Гослинга. – EJP

+0

Я уже не знаком с C++. Разрабатывают ли конструкторы C++ их родительские конструкторы, явно не написанные для этого? Это то, что о.п. ожидает? – Thevenin

ответ

3

Второй объект имеет тип B, поэтому, когда метод someMethod вызывается в конструкторе, он принимает последнее объявление метода этого метода для типа B.

+0

Можете упомянуть полиморфизм. –