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)