質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

5回答

4048閲覧

ポリモーフィズムとは?

masaakitsuyoshi

総合スコア102

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

2クリップ

投稿2016/03/16 08:34

ポリモーフィズム = 同じメソッドにいろんな処理を持たせよう! という概念

オーバーライド、オーバーロードはその具体的な方法。

ポリモーフィズムという考え方の中に、「オーバーライド」、「オーバーロード」 がある、ということでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

家を建てる現場で、監督が大工、左官屋、配管工にそれぞれ個別の命令を出さなくても、「働け」という命令をすればそれぞれの仕事をするよ、すなわち、同じメソッド(この場合は「働け」)を呼び出しても、それぞれ対応した動きをするよ、というのがポリモーフィズムです。

オーバーライドは、大工にはもともと「釘を打て」という命令をすると玄能で釘を打つ、という機能があるとして、ある大工は普通の大工の機能はすべて持っているけれど、「釘を打て」という命令に対しては釘打機で高速に処理する、みたいな感じで、基底のクラスを継承したクラスで、元のクラスのメソッドを上書きすることです。逆に言うと、継承したクラスで特にオーバーライドしていないメソッドは継承元のクラスのメソッドがそのまま使われるということです。

オーバーロードは、ある一つのメソッド名に対し、引数の数や型を違うものは違うメソッドとして扱われるというものです。大工に「働け」という際に釘と玄能を渡すと釘を打つし、カンナを渡すと木を削る、という感じでしょうか。


質問に答えていなかったので追記です。

ポリモーフィズムというのは、「同じメソッドにいろんな処理を持たせよう!」というよりは、それぞれのオブジェクトに対して同じメソッドを呼んでもオブジェクトってそれぞれさまざまなんだからそのオブジェクトに適したそれぞれの動きをするよね、という意味で「同じメソッドでもオブジェクトごとに違う処理が行われるようなオブジェクトで構成されている」という状態のことです。
オーバーライドはそういう状態を作り出す機構の一つではあると思います。

オーバーロードについては、通常のオブジェクトの場合にはポリモーフィズムとは違う気がしますが、演算子のオーバーロードとかはポリモーフィズムっぽいですね。

そのような機構がなくとも、あるいはあってもそれに乗らずに duck typing してても、それはポリモーフィズムと言えると思います。

投稿2016/03/16 09:18

編集2016/03/16 13:39
unau

総合スコア2468

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

unau

2016/03/16 13:39

質問に直接答えていなかったので追記しました。
masaakitsuyoshi

2016/03/17 05:03

追記ありがとうございます。 私にはまだ少し難しいようですが、何となく概要がつかめました!
guest

0

その概念を具体的に実現する手段にそういう名前がついている
と考える方が分かり易い気がしますけどどうでしょうかね?

投稿2016/03/16 09:21

HiroshiWatanabe

総合スコア2160

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

masaakitsuyoshi

2016/03/16 12:24

ポリモーフィズムを実現するのに、 オーバーライド オーバーロード インターフェース などの手法がある、という考え方ですかね?
guest

0

ベストアンサー

様々な回答が先に出ておりますが、質問者様の質問自体が質問に対する答えだと思います。

ポリモーフィズム = 同じメソッドにいろんな処理を持たせよう! という概念
オーバーライド、オーバーロードはその具体的な方法。
ポリモーフィズムという考え方の中に、「オーバーライド」、「オーバーロード」 がある

おそらく質問者様はご自分の考えに確信が得たいということですよね?

投稿2016/03/16 15:09

Aeona

総合スコア396

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

masaakitsuyoshi

2016/03/17 04:58

その通りです。 独学で学んでいるため、自分が果たして正確に理解できているか怪しいので質問させていただきました。 ーーーー ポリモーフィズムを実現するのに、 オーバーライド オーバーロード インターフェース などがある ーーーーー と理解していましたが、合っているようですね!
guest

0

ポリモーフィズムは下記のようなコードで発揮できます。

java

1List<Item> items = new ArrayList<Item>(); 2 3items.add(new (Circle()); 4items.add(new (Rect()); 5items.add(new (Elipse()); 6 7for (Item item : items) { 8 // 図形を描画 9 item.draw(); 10}

下記2つの条件を満たすだけで、同一メソッドであるdraw()を読ん
でいるにも関わらず、複数パターンの図形を描画することができま
す。

・どの図形もItemクラスを継承している
・draw()メソッドを適切にオーバーライドしている

もしポリモーフィズムという概念が無い場合、コードは下記のように
煩雑なものになっていることでしょう。

java

1if (描画対象が円) { 2 // 円を描画 3 drawCircle(); 4} else if (描画対象が四角) { 5 // 四角を描画 6 drawRect(); 7} else if (描画対象が楕円) { 8 // 楕円を描画 9 drawElipse(); 10}

投稿2016/03/16 14:04

nob777

総合スコア112

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

コードで語ります。

実行はこちらから・・・https://paiza.io/projects/neErBydmHr86NXa33WCKlg

Java

1import java.io.BufferedReader; 2import java.io.InputStreamReader; 3 4//https://teratail.com/questions/29940 5class A{ 6 void print(){ 7 System.out.println("A.print!"); 8 } 9 10 //OverLoad 11 void print(String s){ 12 System.out.println(s); 13 } 14} 15 16class B extends A{ 17 //OverRide 18 void print(){ 19 System.out.println("B.Print!"); 20 } 21} 22 23public class Main { 24 public static void main(String[] args) throws Exception { 25 A a = new A(); 26 a.print(); // A.print! 27 a.print("OverLoad!"); // OverLoad! 28 29 //Polymorphism 30 A b = new B(); 31 b.print(); // B.Print! 32 b.print("Polymorphism!"); // Polymorphism 33 } 34}

同じメソッド名で引数違いのものをオーバーロードと呼びます。
基本的にやることは同じだけど指示の仕方を変えるときに使います。

スーバークラス(継承元のクラス)の同じ引数のメソッドを上書きして書き換えることを
オーバーライドと呼びます。
もの(クラス)が違うのでやり方が変わってくるときに使います。

ポリモーフィズムは違う方だけど、同じ呼び出し方ができるので同じクラスとみなしても良い場合に
使います。Javaでは、どのクラスとみなすことが出来るか厳密に定義する必要がありますが、
継承関係がある場合は不要です。(厳密な宣言はインターフェイスというものをつかいます。)

投稿2016/03/16 12:47

iwamoto_takaaki

総合スコア2883

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問