21.
ポリモーフィズム
ポリモーフィズムとは
オブジェクト指向の三大要素
ポリモーフィズムは多態性、多様性などと呼ばれ、オブジェクト指向の三大要素の1つです。
- 継承
- カプセル化
- ポリモーフィズム
オーバーロードとオーバーライド
オーバーロードやオーバライドはポリモーフィズムにあたり、同じメソッドでも異なる動作をするのがポリモーフィズムの大きな特徴です。
オーバーライド
オーバーライドとは
スーパークラスで定義したメソッドを、サブクラス再定義することをオーバーライド(Override) といいます。オーバーライドは、サブクラスでスーパークラスのメソッドを上書きしたり、機能追加して実行できます。
オーバーライドの条件
- 引数の型、数、順番が同じ
- 原則、戻り値の方が同じ
- アクセス修飾子がスーパークラスの公開範囲内に収まっている
アノテーション
メソッドやプロパティ定義の前に @で記述する記法をアノテーションといいます。アノテーションは、Javaで明示的な機能を宣言する記法で、Javaフレームワークでは多数のアノテーションがあります。
アノテーションの例(Java標準)
アノテーション | 説明 |
---|---|
@Override | オーバーライドの定義 |
@Deprecated | クラスやメンバーなどが非推奨 |
@SuppressWarnings | コンパイラー警告を抑制 |
@SafeVarargs | 可変長引数の型安全を宣言 |
@FunctionalInterface | 関数型インタフェースの定義 |
オーバーライドメソッドの定義
スーパークラスと同じメソッドを定義します。メソッドの前には @Overrideをつけます。
オーバーライドのコンパイルエラー
オーバーライドは、スーパークラスと同じメソッドにしなければいけません。メソッド名、戻り値、引数が違うと、コンパイルエラーになります。
スーパークラス

サブクラスクラス

スーパークラスのメソッド実行
「super」を使うと、サブクラスからスーパークラスのメソッドを直接実行することもできます。
オーバーライドの例
Warriorクラスで、attack() メソッドをオーバーライドしてみましょう。 Warriorの攻撃では、1/5の確率で攻撃力を倍にする仕様に変更します。
Warrior.java
結果
1/5の確率で、攻撃力が変わることを確認してみましょう。
ポリモーフィズムのメリット
継承とポリモーフィズムをうまく使うと、コードをまとめて可読性がよくなるメリットがあります。
複数のクラスを同時に扱う
「Wizard」「Warrior」クラスは異なるクラスですが、「Character」クラスを継承しているので、「Character」として扱うことができます。
Character[]にまとめる
「Wizard」「Warrior」のインスタンスを、Character[] データで初期化できます。
App.java
結果
コンソールで確認すると、Characterクラスとして追加されています。
foreach(拡張for文)
配列(コレクション)データを繰り返す方法の1つに、**foreachと呼ばれる 拡張 for文があります。
foreach
foreachの例
Character型の配列「characters」を繰り返し処理する場合です。
forを入力してコードアシスタントで「foreach」を選択します。
Character[]データを自動認識してfor文が入力できました。インデックスを利用しないので、通常のfor文よりもシンプルです。
ポリモーフィズムで処理
App.java
結果
「Wizard」は「Character」のattack()、「Warrior」は「Warrior」クラスでオーバーライドしたattack() が実行されています。
演習
問題1
ポリモーフィズムの説明として正しいのはどれですか?
1)同じメソッド名でも、異なる動作を実行
2)共通のメソッドやプロパティを1つのクラスにまとめ、引き継ぐ
3)オブジェクトを隠蔽して、外部からデータ操作を拒否してデータの不整合を防ぐ
4)抽象メソッドと呼ばれ、メソッドの仕様のみを定義したもの
問題2
クラスに「@Override」のように、「@」でコーディングする記法をなんといいますか?
1)パッケージ
2)アノテーション
3)スーパークラス
4)サブクラス
問題3
「Dog」「Cat」のwalk() をfor文実行してみましょう。