Вызов метода наследования 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 метод класса называется.

Другие вопросы по тегам