2015-05-05 3 views
0
public class Base { 

    int var =0; 
    Base(){ 
     System.out.println("Inside Base constructor ....."); 
     setVar(); 
    } 

    public void setVar(){ 
     System.out.println("Inside base setVar method....."); 
     var+=10; 
    } 

    public int getVar(){ 
     return var; 
    } 
} 

производный класс:Метод вызова с помощью ссылки переменной

public class Derived extends Base { 

    Derived(){ 
     System.out.println("Inside Derived constructor ....."); 
     setVar(); 
    } 

    public void setVar(){ 
     System.out.println("Inside Derived setVar method....."); 

     var+=20; 
    } 

    public static void main(String[] args){ 

     Base b = new Derived(); 
     System.out.println(b.getVar()); 
    } 
} 

выход .....

Inside Base constructor .....              
Inside Derived setVar method.....             
Inside Derived constructor .....              
Inside Derived setVar method.....             
40 

Вопрос ----> почему, когда управление переходит к конструктору базового класса, SetVar() метода производного класса вызывается вместо метода базового класса setVar(). Я ожидал выход как 30, но при запуске этой программы в режиме отладки нашел поток и получил выход как 40. Может ли кто-нибудь объяснить логику этого. Thanks

ответ

0

Java решит, какой метод будет выполняться на основе типа среды выполнения, то есть полиморфизма всегда, даже если метод вызван из конструктора базового класса.

Когда вызывается конструктор базового класса, полиморфизм означает, что вызывается производная класс setVar и добавляется 20. Затем вызывается конструктор производного класса, и снова вызывается версия производного класса setVar, и снова добавляется 20, давая 40.

+0

На ваш ответ у меня есть два сомнения: 1> Это означает, что если в основном методе, даже если я меняю Base b = new Derived() на Derived d = new Derived() то же самое произойдет? 2> Как вызвать метод базового класса setVar() с использованием объекта класса Derived? –

+0

1. Да, имеет значение только тип времени выполнения. 2. Из кода, вызывающего методы класса, переопределенный метод недоступен. Из внутреннего кода в класс вы можете вызвать 'super.setVar();'. – rgettman

+0

«Из кода, вызывающего методы класса, переопределенный метод недоступен». Не могли бы вы рассказать о своем заявлении? –

0

Полиморфизм на работе.

Когда вы переопределяете метод суперкласса в производном классе, тогда всегда ваш переопределенный метод в производном классе вызывается, когда кто-то работает с любым объектом производного класса, даже если это кто-то суперкласс.

так DerivedsetVar() вызывается дважды, потому что он переписан в «Derived», и вы пытались создать объект класса «Derived».

Смежные вопросы