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

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

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

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

Q&A

解決済

1回答

5888閲覧

インスタンス化の際,参照変数をインターフェース型にする意味

zoemond

総合スコア50

Java

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

1グッド

1クリップ

投稿2016/05/19 07:56

###質問

Javaのインターフェースについて勉強中です。
以下コードの利点について知りたいです。

java

1インターフェース 参照変数 = new インターフェースを実装したクラス()

###私の理解と具体的な疑問点
クラスについて
クラスをインスタンス化する際,参照変数をスーパークラスの型にすることは、ポリモーフィズムによって記述する量を減らせるという利点があると理解しています。

インターフェースについて
インターフェースはメソッドの処理部分を記述できないため、量を減らすメリットはないように思えます。

一つ見つけた利点としては、以下のようにDrawableインターフェースを実装したRectangle, Circle, Triangleクラスを配列として扱うとfor文で扱えるようになるという点です。

java

1Drawable[] shapes = { new Rectangle(), new Circle(), new Triangle() }; 2 3 shapes[0].draw(); // 長方形を描く 4 shapes[1].draw(); // 丸を描く 5 shapes[2].draw(); // 三角形を描く

インターフェース型の配列としてインスタンス化するとき以外に、参照変数をインターフェース型にすることはありますか?
また、その利点は何でしょうか?

DJR-tech👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

例えば、以下のような利用方法もあります。

java

1public class Main { 2 3 public static void main(String[] args) { 4 5 Drawable someShape = createDrawable("circle"); 6 7 drawRichly(someShape); 8 } 9 10 private static Drawable createDrawable(String shape) { 11 if ("rectangle".equals(shape)) { 12 return new Rectangle(); 13 } 14 15 if ("circle".equals(shape)) { 16 return new Circle(); 17 } 18 19 if ("triangle".equals(shape)) { 20 return new Triangle(); 21 } 22 23 throw new IllegalArgumentException("知らない形状"); 24 } 25 26 private static void drawRichly(Drawable drawable) { 27 System.out.println("今から描画します"); 28 29 drawable.draw(); 30 31 System.out.println("描画しました"); 32 } 33} 34

メソッドの戻り値や引数をインターフェースで定義すると、
実装の詳細を隠蔽しながら(そのインターフェースを実装した何のクラスをやり取りしているのかを気にすることなく)
インスタンスを引き回せるようになります。

他の用例やもっと突っ込んだ解説を知りたければ、『Effective Java 第2版』などを読んでみることをお勧めします。
http://www.amazon.co.jp/EFFECTIVE-JAVA-Java-Joshua-Bloch/dp/4621066056

投稿2016/05/19 08:25

編集2016/05/19 08:29
KiyoshiMotoki

総合スコア4791

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

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

zoemond

2016/05/19 08:28

なるほど! よくわかりました。 丁寧に答えていただきましてありがとうございます。 また、本を調べていなくてすみませんでした。
KiyoshiMotoki

2016/05/19 08:32

お役に立てたなら、幸いです。 > 本を調べていなくてすみませんでした。 そういうつもりで申し上げたわけではありませんよw 興味があれば、手に取ってみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問