Вызов метода наследования Java
У меня есть интересный сценарий.
public class Base {
public void hello(){
this.say();
System.out.println("hello-Base");
}
protected void say(){
System.out.println("say-Base");
}
}
public class Derived extends Base {
public Derived(){
super.hello();
}
public static void main(String[] args) {
Derived d = new Derived();
}
public void say(){
System.out.println("say-Derived");
}
}
Данный вывод таков:
say-Derived
hello-Base
Я ожидал, что когда вызывается метод super.hello(), вызывается метод say() базовых классов, а не метод say() класса Derived.
В чем причина этой логики?
3 ответа
Решение
Super.hello() вызывает this.say(), который (this) ссылается на текущий объект, т. Е. Производный, поэтому он вызывает метод say производного класса.
super.hello(); возникает из производного конструктора, т.е. объекта производного класса. Который в свою очередь вызывает this.say(), т.е. Так вот почему вывод так.
Так как this
- указывает на ---> Экземпляр типа Derived
Так что из-за переопределения Derived
метод класса называется.