これでもシステムエンジニア

watarunrun

これでもシステムエンジニア

【Java】継承とポリモーフィズム

継承とポリモーフィズムについて軽くまとめてみる

 

 

 

 

継承

・継承にはextends句を使用する。
javaは多重継承をサポートしていないためextends句の後は1クラスのみ記述可
インターフェースは多重継承が可能

継承元のクラスを多重継承をサポートしていないためextends句の後は1クラスのみ記述可

インターフェースは多重継承が可能

 

継承元のクスーパーラスを
継承したクラスをサブクラスと呼ぶ

継承を行うとスーパークラスのメソッドと変数をサブクラスに引き継ぐことができる。
privateなフィールドとスーパークラスのコンストラクタは引き継がれない

f:id:koko55120:20190225231056p:plain

すべてのクラスはobjectクラスを親に持つ。
※何も継承しないでクラスを定義してもobjectクラスを親に持つことになる。
なので、objectクラスのequalsメソッド等を使用することができる。

 

オーバーライド

・アクセス修飾子が元より同じか公開範囲の広いもの。
・メソッド名と引数リストがすべて同じであること
・戻り値が同じであるかその戻り値の型がサブクラスであればオーバーライドとしてみなされる

f:id:koko55120:20190225230045p:plain

 

thisとsuper

自信のオブジェクトを指す場合this句を使用する。
メソッドの引数と自オブジェクトの変数を分ける時などに使用する。

また、コンストラクタ内で使用すれば別のコンストラクタを呼ぶことができる。
ルールとしてコンストラクタ内の一番上に記載しなけれればならない。

自オブジェクトから見て親クラスを指すにはsuper();句を使う。
スーパークラスにあるメソッドや変数にアクセスできる。
f:id:koko55120:20190225231819p:plain
 スーパークラスのコンストラクタを明示的に呼ぶこともできる。

こちらもthis句と同様コンストラクタ内で一番上に記載しなければならない。

つまり、コンストラクタ内でthisとsuperを同じ場所で書くのは不可能である。

 

抽象クラス 

 

抽象クラスはabstract宣言をする。


抽象メソッドと実装メソッドを混在させることができる。

抽象クラスはインスタンス化できない。

 

共通の処理は抽象クラスにまとめ、必要に応じて継承させる使い方がセオリー

継承したサブクラスにメソッドのオーバーライドを強制させたりの役割がある。

 

 インターフェース

実装はimplements 継承のextendsと混雑する場合、継承の後に記載する。

インターフェースはいくつも実装できる。

インターフェースは多重継承も可

実装を持つメソッドを宣言できない。

インタフェースに宣言できる内容は以下の通り。

・static定数

・staticメソッド

・抽象メソッド

・defaultメソッド

インターフェースでは変数を宣言しても定数として扱われる。
宣言時に自動でpublic static final修飾子が付与される。

メソッドも同様で自動でpublic abstractが修飾子が付与される。

抽象メソッドが一つのインターフェースを関数型インターフェースという。
※この説明は別でします

キャスト

基本的な考え。 基本データ型であれば、大きいデータ型から小さいデータ型への代入は不可能

参照型の場合、親クラス型の変数に子クラス型のオブジェクトを代入することは可能。
暗黙型変換という 基本データ型も参照型も必要に応じてキャスト(型変換)ができる。

f:id:koko55120:20190225234102p:plain

 

ポリモフィズム

日本語で言えば多態性という。

オブジェクトによって必要な振る舞いを行う。

 

例えば、親クラスAと子クラスBに同一のメソッドがある状態(オーバーライド)してるとき。

  A obj = new A(); B obj = new B();


オブジェクトにあったメソッドを呼び出してくれる
f:id:koko55120:20190225235622p:plain

オブジェクトによって呼び出すメソッドが違う。
これが重要。

 

親クラス型で受け取るメソッドを用意して
変数名.メソッド呼び出しとしておけば将来
クラスが追加されてもインスタンスを渡すだけでよくなる

 

振る舞いが変わるとはいえ、フィールドに関しては宣言したクラス型に合わせて呼び出しされるので注意

f:id:koko55120:20190226000019p:plain