処理を受け継ぐ「継承」とは
以前作成したクラスと
似通ったクラスを作成する場合などに
効率よく作成できる為の思想です。
「継承」
- 親クラス(スーパークラス)を基に子クラス(サブクラス)を定義できる
- 共通の処理を引き継ぐことができる
- 子クラス独自の処理を付け加える事ができる(差分だけ記述)
- 親クラスに宣言が存在するメソッドを、子クラスで上書き宣言することを
オーバーライド という - final付きクラスは継承できず、final付きメソッドはオーバライド出来ない
- 継承には、「抽象的・具体的」の関係にあることを定義する役割もある
オーバーライド(上書きする事)
親クラスを継承して子クラスを宣言する際、
親クラスのメンバを子クラス側で再定義することです。
class サブクラス名 extends スーパークラス名 { クラス本体 }
継承を用いて子クラスに宣言されたメンバについて
①親クラスに同じメンバがなければ、そのメンバは「追加」になる
②親クラスに同じメンバがあれば、そのメンバは「上書き変更」される。
継承されたクラスのメソッドの呼び出し
外部からメソッドの呼び出しがある場合は、
外側に有る子インスタン部分のメソッドで対応します。
例えば両方のクラスで
同じメソッドが定義されている(オーバーライド)場合は
外側(子クラス)のメソッドが優先的に動作する為、
内側(親クラス)のメソッドが動くことはありません。
親インスタンス部について
- 親インスタンス部のフィールドを利用:
super .フィールド名 - 親インスタンス部のメソッドを呼び出す:
super .メソッド名(引数)
Aクラス(祖父母)、
Bクラス(親)、
Cクラス(自分)という
3つのクラスが継承関係にある時
インスタンス生成も3重構造になります。
その際に一番外側に相当する
Cインスタンスについては、
Cクラスのメソッドから
Aクラスのインスタンス部には
直接アクセスはできない。
- Cクラスのメソッド→Cクラスのインスタンス:this
- Cクラスのメソッド→Bクラスのインスタンス:super
- Cクラスのメソッド→Aクラスのインスタンス:✕
全てのコンストラクタは、
先頭で必ず親クラスのコンストラクタを
呼び出さなければなりません。
親クラスのコンストラクタの呼び出し
- super(引数);
1 2 3 4 5 6 |
public class SuperMonster extends Monster{ SuperMonster() { super(); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
public class Monster { private String name; private int hp; Monster(){ } Monster(String name){ this.name = name; } Monster(String name, int hp){ this.name= name; this.hp = hp; } public int attack() { return this.hp = -10; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getHp() { return hp; } public void setHp(int hp) { this.hp = hp; } } |
この記事へのコメントはありません。