確かめたかったことは以下のコードと結果が全てです。
Parentクラスのgreet()メソッドでは内部でsay()メソッドを呼び出しています。
Childクラスではsay()メソッドをオーバーライドしています。その結果Childクラスのgreet()メソッドではChildクラスのsay()メソッドが使用されています。
これはParent childParent = child;のようにしてParentクラスのインスタンスとして扱って childParent.greet();のように呼び出した場合もChildクラスのsay()メソッドが使われます。(こっちは参照の流れを考えると当然な気もしてきた。)
Parentクラスのインスタンスだと思ってgreet()メソッドを呼び出したら、実はChildクラスのsay()メソッドが裏で使われていたとなるとコードリーディングしづらくなりそうですね。
public class Main {
public static void main(String[] args) {
Parent parent = new Parent();
Child child = new Child();
Parent childParent = child;
parent.greet();
child.greet();
childParent.greet();
}
}
class Parent {
public void greet() {
say("Hello");
}
public void say(String word) {
System.out.println(word);
}
}
class Child extends Parent {
@Override
public void say(String word) {
System.out.println(word + "!");
}
}
出力
Hello
Hello!
Hello!