Javaのポリモーフィズムのサンプルです。
目次
サンプル | ポリモーフィズムとは |
ポリモーフィズムのサンプル | |
コレクション(List)を使ってポリモーフィズムを実現 |
ポリモーフィズム
- 複数のクラスで同じインターフェースを実装(抽象クラスを継承)します。
- 呼び出す側のメソッドの引数のデータ型にインターフェース(抽象クラス)を指定した場合、
メソッドの引数は、異なるクラスのインスタンスを指定できるようになります。
→引き渡すインスタンスによって処理の内容が変えることができます。
→ポリモーフィズム、多態性とも呼ばれます。 - ポリモーフィズムは、オブジェクト指向の3大要素の一つです。(他はカプセル化と継承)
ポリモーフィズムのサンプル
package test1;
//インターフェース
interface Parts{
void print();
}
// Class1
class Machine1 implements Parts { //同じインターフェースを実装
@Override
public void print() {
System.out.println("RED");
}
}
//Class2
class Machine2 implements Parts { //同じインターフェースを実装
@Override
public void print() {
System.out.println("BLUE");
}
}
public class Test1 {
public static void main(String[] args) {
Machine1 m1 = new Machine1();
Machine2 m2 = new Machine2();
exe01(m1); // RED 同じメソッドだが結果は異なる
exe01(m2); // BLUE 同じメソッドだが結果は異なる
}
// 同じインターフェース型でアクセスできる
static void exe01(Parts m){ // 引数の型はインターフェース型
m.print();
}
}
27,28行目は同じexe01メソッドを実行していますが引数が異なるため出力される内容は異なります。
31行目の引数の型はインターフェース型になっています。
コレクション(List)を使ってポリモーフィズムを実現
上記のコードは、コレクションを使用して書き換えることができます。
package test1;
import java.util.ArrayList;
import java.util.List;
//インターフェース
interface Parts{
void print();
}
// Class1
class Machine1 implements Parts { //同じインターフェースを実装
@Override
public void print() {
System.out.println("RED");
}
}
//Class2
class Machine2 implements Parts { //同じインターフェースを実装
@Override
public void print() {
System.out.println("BLUE");
}
}
public class Test1 {
public static void main(String[] args) {
List<Parts> list = new ArrayList<>();
list.add(new Machine1()); //インスタンスを追加
list.add(new Machine2()); //インスタンスを追加
for(Parts pt : list) { //データ型はインターフェース
exe01(pt); // RED BLUE
}
}
// 同じインターフェース型でアクセスできる
static void exe01(Parts m){ // 引数の型はインターフェース型
m.print();
}
}
27,28行目は、インスタンスをコレクションのリストに追加しています。
30~32行目は、拡張for文でループを回してメソッドを実行しています。同じインターフェースの型なので実行できます。
関連の記事
Java インターフェースのサンプル(interface)
Java 抽象クラスと抽象メソッドのサンプル(abstract)