背景
Javaの資格勉強をしている際に、なかなか理解できなたったところの備忘録。
きっとJavaを触り始めた人でもなかなか難しいところ(のはず)だと思うので、わかりやすく簡単に書くよ。
以下のキーワードを踏まえたうえで、解説していくよ。
キーワード
継承:クラスの中身の変数やメソッドをそのまま受け継がせること。
オーバーライド:スーパークラスのメソッドと戻り値の方、メソッド名、シグニチャが同じメソッドを再定義できること。
継承とオーバーロード
早速だけど説明するよりコードを見た方がはやいのでサンプルコードを書くよ。
1. class SuperSample {
2. String val = "Super";
3. void print() {
4. System.out.print(val);
5. }
6. }
7.
8. class SubSample extends SuperSample {
9. String val = "Sub";
10. }
1. public class Main {
2. public static void main(String[] args) {
3. SuperSample super = new SuperSample();
4. SuperSample sub = new SubSample();
5. System.out.print(super.val);
6. System.out.print(sub.val);
7. super.print();
8. sub.print();
9. }
10. }
上記のようなコードで、メインクラスを実行した場合に出力される文字がなにかを考えていくよ。
結論から書くと、SuperSuperSuperSper
と出力されるよ。
前提として、サブクラスのインスタンスはスーパークラスのインスタンスと差分のインスタンスで構成されるので、SubSampleクラスには2つのフィールドが存在することになっているよ。ここでは、その2つのフィールドのどちらが利用されるのかを理解する必要があって、その見極め方は次の通り。
フィールドを参照した場合、変数の型で宣言された方
メソッドを呼び出した場合、メソッド内の指示に従う
つまり、mainクラスの5,6行目ではフィールドを参照
していて、どちらも変数の型はSuperSample型
なので、どちらもSuperSampleのフィールドが出力
されるよ。
mainクラスの7,8行目ではメソッドを呼び出し
ていて、print()
はSuperSampleクラスに定義されているので、同じクラスに定義されているフィールド
を出力するよ。従って、どちらもSuperSampleクラスのフィールドが出力
されることになるよ。
でも、ここでもし、SuperSampleクラスのメソッドprint()をSubSampleクラスで再定義(オーバーライド)していると、少し動きが変わるよ。
1. class SuperSample {
2. String val = "Super";
3. void print() {
4. System.out.print(val);
5. }
6. }
7.
8. class SubSample extends SuperSample {
9. String val = "Sub";
10. void print() {
11. System.out.print(val);
12. }
10. }
このように、SubSampleクラスでSuperSampleクラスのメソッドをオーバーライドすると、mainクラス8行目で、SubSampleクラスのメソッドprint()が動作
するので、Subと表示されるようになるよ。
つまり、出力結果としては、SuperSuperSuperSub
となるよ。
これは、SubSample(差分インスタンスを持っている状態のもの)をSuperSample型として扱っているだけで、差分は持っている状態だよ。その差分にオーバーライドしたされたメソッドがあればそちらを優先して利用する
からだよ。
まとめ
継承とオーバーライドについて押さえておくべきポイントをまとめるよ。
フィールドを参照した場合、変数の型で宣言された方
メソッドを呼び出した場合、メソッド内の指示に従う
オーバーライドしたされたメソッドがあればそちらを優先して利用する