ポリモーフィズムという用語が出てきたから調べてみた。
英語では「polymorphism」と書き、「多型、多型性」という意味を持つ。
プログラミングで言うポリモーフィズムは、継承によってスーパークラスとサブクラスが複数個関連しあっているときにおこるもの。
スーパークラスとサブクラスについては以下参照。
【Java】継承とは?スーパークラスとサブクラスについて by プログラミング初心者vol.49
1つのスーパークラスが複数のサブクラスに継承されているときに使える書き方がある。
複数のサブクラスに継承されたときの便利なコードの書き方
「Fruit」というクラスのメソッドを「Apple」と「Banana」が引き継いでいるというコード。
public void color() {
System.out.println(“色は果物による”);
}
}class Apple extends Fruit {
public void color() {
System.out.println(“Red”);
}
}class Banana extends Fruit {
public void color() {
System.out.println(“Yellow”);
}
}
public class PolymorphismDayo {
public static void main(String[] args) {Fruit fruit = new Fruit();
Fruit apple = new Apple();
Fruit banana = new Banana();
fruit.color();
apple.color();
banana.color();
オブジェクトを作成している部分に注目。
Fruit fruit = new Fruit();
Fruit apple = new Apple();
Fruit banana = new Banana();
今までは「Fruit apple = new Apple(); 」は「Apple apple = new Apple();」としていた。
Bananaについても同様。
オブジェクトの作成方法については以下参照。
自作したクラスに状態を表すデータを作る-オブジェクトの作成方法 by Javaプログラミング初心者 Vol.37
「class Apple extends Fruit」などとあることからAppleとBananaはともに「Fruit」クラスを継承している。
ポリモーフィズム。
よってAppleとBananaクラスはFruitクラスに属していることになる。
AppleとBananaのオブジェクトを作成したい場合は「Fruit apple = new Apple(); 」といった書き方が可能になる。
ただし、この形は継承(extends)が使われている時だけ使える。
ある1つのクラスから複数のサブクラスへ継承されている時、この形を使うとどこからクラスが継承されているかも分かりやすくなる。
「継承」したクラス(サブクラス)が複数あるときに使うと便利。
コードの実行結果
上の項目の赤枠のコードを実行すると以下のようになる。
Red
Yellow
「色は果物による」という結果は、「fruit.color();」が実行されて表示されたもの。
「Fruit fruit = new Fruit(); 」を入力し、Fruitクラスのオブジェクト「fruit」という名前を作成して、「colorメソッド」を実行するように指定したということ。
結果、Fruitクラスの中に作った「System.out.println(“色は果物による”);」が実行された。
「Red」は「apple.color();」が実行されたもの。
「apple」は「Fruit apple = new Apple(); 」というコードから作られた。
「apple」はFruitというデータの形をした、Appleクラスから作られたオブジェクトの名前ということ。
「colorメソッド」を指定することで、Appleクラスに作った「System.out.println(“Red”);」が実行された。
「Banana」は「banana.color();」が実行されたもの。
原理は「Appleクラス」と同じ。
FruitとAppleとBananaはそれぞれ「color(){}」という同じ名前のメソッドを使用している。
作成したオブジェクトの名前を使い「apple.color();」などと指定することでそれぞれのクラスの中に書いた異なる処理内容を持つ「colorメソッド」が実行された。
出来なかった事
AppleクラスやBananaクラスに書いたcolorメソッドは「Fruit apple = new Apple(); 」といったオブジェクトの作り方で呼び出すことができた。
だが試しにAppleクラスの中に書いてみた「String iro = “Red”;」といったデータは「Fruit apple = new Apple(); 」というオブジェクトでは呼び出すことはできなかった。
String iro =”たくさん”;
}class Apple extends Fruit {
String iro =”赤”;
}class Banana extends Fruit {
String iro =”黄色”;
}public class PolymorphismDayo {
public static void main(String[] args) {
Fruit fruit = new Fruit();
Fruit apple = new Apple();
Fruit banana = new Banana();
System.out.println(fruit.iro);
System.out.println(apple.iro);
System.out.println(banana.iro);
変数の型は「String(文字列)」、変数名は「iro」として、FruitクラスとAppleクラスとBananaクラスの3つともに使用した。
内容はそれぞれ「たくさん」、「赤」、「黄色」という異なるデータを保持している。
オブジェクトの作り方は上で見たものと同じ形を使った。
メソッドを呼び出した時と同じように、オブジェクト名と変数名を指定した。
メソッドと違ってそのままだと使えないため、画面に表示させるコードの「System.out.println」を使用した。
System.out.println(fruit.iro);
System.out.println(apple.iro);
System.out.println(banana.iro);
実行してみると、以下のようになった。
たくさん
たくさん
あれ?
思ってたんと違う・・・
本当は以下のような表示になる予定だった。
赤
黄色
このことから、どうやら「Fruit apple = new Apple(); 」という形で作ったオブジェクトはメソッドしかちゃんと呼び出せないらしい。
AppleクラスもBananaクラスもFruitクラスを引き継いでいるから、Fruitクラスの「String iro =”たくさん”;」の「iro」という変数名のみが参照されて全部「たくさん」という表示になったみたい。
もしも青枠のように表示させたかったら、いつものオブジェクトの作成方法と同じように「Apple apple = new Apple(); 」などと作るといい。
最後に
一つのクラスに対して複数のクラスがデータを引き継いだりして関連しているのを「ポリモーフィズム」という。
カタカナって覚えるの難しい。
プログラミングっていろんな用語が出てくるけど、英語が基本だから日本語に訳されたものってほとんどカタカナなんだよねー。
オブジェクトとかパッケージとかポリモーフィズムとかプリミティブとか・・・。
言葉を覚えるより、どんなものかを覚えようと思います。。。
コメント