前回までの学びJAVA学習の記録⑥ 【コンストラクター】
目次
1.ポリモーフィズム
2.手順の解説
1ポリモーフィズム
ポリモーフィズムとは、「インターフェース」などを利用して、メソッドの呼び出し方法を共通化し、さらに「オーバーライド」させることで同じメソッドを呼び出しても、実際のインスタンス毎にその挙動を変化させようとする考え方。
今までのやり方でクラス作成からメソッドの呼び出しまでを行うと(各クラスが同じメソッドをもっているとする)
①Dogクラスの定義
②eatメソッドの定義
③インスタンスの作成
④メソッドの呼び出し
ここで猫を表すCatクラスを追加すると
⑤Catクラスの定義
⑥eatメソッドの定義
⑦インスタンスの作成
⑧メソッドの呼び出し
さらに鳥を表すBirdクラスを追加すると・・・
ポリモーフィズムを使うと
①インターフェースを定義
②抽象メソッドを定義
③クラスにインターフェースを実装
④インターフェースを実装したクラスでオーバーライドしたメソッドの定義
⑤インスタンスの作成
⑥メソッドの呼び出し
というような手順になります。
何が言いたいのかというと、ポリモーフィズムを使うことで複数の異なるクラスを統一的に扱い、メソッドを呼び出すことができます。つまり、各クラスの同じ処理を記述する(似たようなコードを重複して書く)必要がなくなります。
下記では、DogクラスとCatクラスの共通部分として、Petを用意して実践。
public interface Pet { //①インターフェースを定義
public void eat(); //②抽象メソッドを定義
public void eat(String food);
}
public class Dog implements Pet { //③クラスにインターフェースを実装
@Override //④インターフェースを実装したクラスでオーバーライドしたメソッドの定義
public void eat() {
eat("ご飯");
}
@Override
public void eat(String food) {
System.out.println(food + "を食べるよ!おいしいワン");
System.out.println("お腹が一杯になったワン");
}
public class Cat implements Pet { //③クラスにインターフェースを実装
@Override //④インターフェースを実装したクラスでオーバーライドしたメソッドの定義
public void eat() {
eat("ご飯");
}
@Override
public void eat(String food) {
System.out.println(food + "を食べるよ!おいしいにゃー");
System.out.println("お腹が一杯になったにゃー");
}
public class InterfaceSample {
public static void main(String[] args) {
Pet pet = new Cat(); //⑤インターフェースを実装したクラスのインスタンスをインターフェース型の変数に代入
pet.eat(); //⑥メソッドの呼び出し
pet = new Dog();
pet.eat();
}
}
出力結果
ご飯を食べるよ!おいしいにゃー
お腹が一杯になったにゃー
ご飯を食べるよ!おいしいワン
お腹が一杯になったワン
2.手順の解説
①インターフェースを定義
上記の例では、CatクラスとDogクラスの共通項として、Petを例にあげました。そのPetを定義するためのものがインターフェースです。
インターフェースの定義の仕方
アクセス修飾子 interface インターフェース名 {
//構成要素を定義
}
②抽象メソッドを定義
抽象メソッドの定義の仕方
インターフェースにメソッドを定義しますが、これまでのクラスとは違い、抽象メソッドを定義します。通常のメソッドとの違いは、
処理を書くためのブロック{}で囲まれた部分を持たない
という点です。抽象メソッドを定義するには、publicとabstruct修飾子を付けます。
public abstruct 戻り値の型 メソッド名(引数リスト);
③インタフェースを実装したクラス作り
インタフェースを利用するためには、CatとDogの各クラスにインターフェースを実装する必要があります。
インターフェースを実装したクラスの定義
アクセス修飾子 class クラス名 implements インタフェース名 {
}
④インターフェースを実装したクラスでオーバーライドしたメソッドの定義
オーバーライドとは、元のメソッドと同じメソッド名、戻り値、引数のメソッドを定義することです。
実装クラスでは、インターフェースで定義されている抽象メソッドをオーバーライドした中身の処理があるメソッドを定義します。
public class Cat implements Pet {
@Override //メソッドをオーバーライドするときは、その前に「@Override」と書く。
public void eat() {
//処理を書く
}
⑤インターフェースを実装したクラスのインスタンスをインターフェース型の変数に代入 ⑥メソッドの呼び出し
以下では、Catクラス型のインスタンスを、Petインタフェース型の変数に代入しています。なので、変数petには、Catクラス型のインスタンスが代入されていて、Catクラスに定義されているeatメソッドを呼び出されます。
Pet pet = new Cat(); //⑤CatクラスのインスタンスをPetインターフェース型の変数に代入
pet.eat(); //⑥Catクラスに定義されているeatメソッドを呼び出す
参考文献
「いちばんやさしいJAVAの教本」著者 石井真
参考サイト
https://nuxtblog.work/blog/jakw-gllp/
https://java-code.jp/132