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
На ваш ответ у меня есть два сомнения: 1> Это означает, что если в основном методе, даже если я меняю Base b = new Derived() на Derived d = new Derived() то же самое произойдет? 2> Как вызвать метод базового класса setVar() с использованием объекта класса Derived? –
1. Да, имеет значение только тип времени выполнения. 2. Из кода, вызывающего методы класса, переопределенный метод недоступен. Из внутреннего кода в класс вы можете вызвать 'super.setVar();'. – rgettman
«Из кода, вызывающего методы класса, переопределенный метод недоступен». Не могли бы вы рассказать о своем заявлении? –