継承された子クラスから親クラスのメンバを呼び出したい
〈親クラスのメンバを呼び出す〉
親クラス
void run( ){
System.out.println("逃げ出した"):
}
子クラス(オーバーライド 再定義)
void run( ){
System.out.println("撤退した");
}
※子クラス側でrun( );メソッドの中身は再定義しているが、親クラスのrun( );メソッドを削除して上書きしたわけではない(親クラスもそのまま残っている)
Mainメソッドで、 run( ); と呼び出すと、、、
親クラス、子クラス共にメソッド名はrun( );だが、
子クラス側(再定義した側)のrun( );の方が呼び出される
→親クラス側のメソッドを呼び出したい時
super.メソッド名( ){.....}
インスタンスのイメージ図
ーーーーーーーーーーーーーー
/ 子インスタンス /
/ ーーーーーー /
/ / 親インスタンス/ /
/ ーーーーーー /
ーーーーーーーーーーーーーー
new superHero( );
↓
① まず、親インスタンスが作られる
② 外側に子インスタンスが作られる
よって、子クラスから生まれたインスタンスの中には親クラスから生まれたインスタンスが自動的にを含まれている
二重構造になっている(孫クラスがある場合は三重構造)
・インスタンスが外部から呼び出されると、このように多重構造のインスタンスでは
極力外側の格子の中にあるメソッドから呼び出そうとする
↓
もし、外側に該当するメソッドがなければ内側の格子の中に入って調べる
※そのため、super.をつけなければ、外側の子クラスのメソッドの方が呼び出されてしまう
★ 子クラスのメソッドを一度呼んでから、その子クラスのメソッドに親クラスのメソッドを呼んでもらうというコードにした方が良い場合もある
ex.子クラスで一度attack( )をしてから、もし空を飛んでいる状態なら、もう一度attack( )を行いたい
もし子クラス側だけでコードの記述をすると、、、
void attack(Matango m){
親クラスと一緒のアタック内容のコードを記述
if(this.flying){
アタックの内容のコードを再度記述
}
ただこれだとアタックの内容のコードを再度記述しているため、
もし親クラスのアタックコードが変更されてもこちらは自動では変更されない
↓
どうせ親クラスと同じコードを書くなら、親クラスから直接呼び出せば良い
(こうすれば親クラスが変更されても自動で子クラス側も変更される)
void attack(Matango m){
super.attack(m);
if(this.flying){
super.attack(m);
}
}
子クラスのattack( )を呼び出すと、子クラスのattack( )が親クラスのattack( )を呼び出す
☆まとめ☆
親クラスのメンバの利用
super.フィールド名
super.メソッド名(引数)