確かめたかったことは以下のコードと結果が全てです。
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!