Javaのポリモフィズムのサンプルです。
目次
サンプル | ポリモフィズム |
コレクションを使用 |
ポリモフィズム
- メソッドの処理で使用するインスタンスによって処理が変わることです。
- 例:複数のクラスで同じインターフェースを実装するとします。
あるメソッドの引数のデータ型にインターフェースを指定します。
「メソッド名(インタフェースのデータ型 変数)」
これによりメソッドの引数は、異なるクラスのインスタンスを指定できます。
→引き渡すインスタンスによって処理の内容が変わります。 - 多態性とも呼ばれます。
ポリモフィズムのサンプルです。
package test1;
//インターフェース
interface InterfaceA{
void print1(); // 抽象メソッド
}
// Class1
class Class1 implements InterfaceA {
@Override
public void print1() {
System.out.println("123");
}
}
//Class2
class Class2 implements InterfaceA {
@Override
public void print1() {
System.out.println("456");
}
}
public class Test1 {
public static void main(String[] args) {
Class1 c1 = new Class1();
Class2 c2 = new Class2();
exe01(c1); // 123
exe01(c2); // 456
}
// 同じインターフェース型でアクセスできる
static void exe01(InterfaceA c){
c.print1();
}
}
8,15行目の2つのクラスは4行目のインターフェースを実装しています。
24行目は、8行目のClass1クラスをインスタンス化しています。
25行目は、15行目のClass2クラスをインスタンス化しています。
27,28行目は同じexe01メソッドを実行していますが出力される内容は異なります。
31行目の引数の型はインターフェース型になっています。
コレクションを使用
上記のコードは、コレクションを使用して書き換えることができます。
package test1;
import java.util.ArrayList;
//インターフェース
interface InterfaceA{
void print1(); // 抽象メソッド
}
// Class1
class Class1 implements InterfaceA {
@Override
public void print1() {
System.out.println("123");
}
}
//Class2
class Class2 implements InterfaceA {
@Override
public void print1() {
System.out.println("456");
}
}
public class Test1 {
public static void main(String[] args) {
ArrayList<InterfaceA> a = new ArrayList<>();
a.add(new Class1());
a.add(new Class2());
for(InterfaceA ifa : a) {
exe01(ifa); // 123 456
}
}
// 同じインターフェース型でアクセスできる
static void exe01(InterfaceA c){
c.print1();
}
}
27,28行目は、インスタンスをコレクションのリストに追加しています。
30~32行目は、拡張for文でループを回してメソッドを実行しています。同じインターフェースの型なので実行できます。
関連の記事
Java入門 クラスの仕組みとサンプル
Java クラスの継承の仕組みとサンプル
Java コンストラクタのサンプル
Java オーバーライドのサンプル
Java インターフェースのサンプル(interface)
Java 抽象クラスと抽象メソッドのサンプル(abstract)