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

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

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

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

Q&A

3回答

18514閲覧

サブクラスのオブジェクトをスーパークラス型変数に代入する理由はなぜですか

k_mail

総合スコア90

Java

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

0グッド

0クリップ

投稿2016/02/21 06:52

Java SE7 Silver の資格を目指し勉強中の学生です。
実務経験はありません。

ポリモーフィズムについて質問です。
なぜ、サブクラスのオブジェクトをスーパークラス型変数に代入するのでしょうか。

サブクラスのメソッドやフィールドが使えなくなるので、不便になるのでは、と思います。
また、extendsやimplementsの時にしか使えず、すでに継承や実装をしているので、
わざわざ、型を明示しなくても使えるのではと思いました。

1 class A{
2 public A(){
3 System.out.println("A");
4 }
5 }

1 class B extends A{
2 public B(){
3 System.ou.println("B");
4 }
5 }

これらのクラスを利用する以下のプログラムを実行したときの結果は?

1 public class Main{
2 public static void main(String[] args){
3 A a = new B();
4 }
5 }

回答は「A Bと表示される」です。

子クラスのコンストラクタを呼び出すと、必ず親クラスのコンストラクタが先に処理されるということは回答を見てわかりました。
ただ、Mainクラスの
A a = new B();
について、すでにクラスBはAを継承しているので
B a = new B();
でもいいのではと思いました。

実務を積まないと分かりにくいとネットに書いてありましたが、
どうぞ、よろしくお願いします。

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

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

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

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

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

guest

回答3

0

スーパークラス(もしくはインターフェース)とサブクラスを実装するのが別人だとするとどうでしょう。

ライブラリ側がインターフェースAだけ用意していて「適切な実装作って渡して」という形を取っていた場合、ユーザーがサブクラスBを作ってライブラリに渡すことになります。渡す時には必ずA型としてです。だってライブラリ側はB型なんて知らないんだから受け取りようがありません。

こうやって「実装のことは知らないけど」で受け渡しすることを疎結合であると言います。疎結合であるとモジュール同士(ここでは、ライブラリとユーザープログラム)が不必要に干渉しあいません。どちらかに修正を加えても、他方に及ぼす影響が限定されるのです。

投稿2016/02/21 23:13

yuba

総合スコア5568

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

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

0

これは、オブジェクト指向が満たすべき原則である「リスコフの置換原則」を表しています。
ざっくり言うとスーパークラスの型変数にはサブクラスのインスタンスを入れることが原則的にできるということを表しています。

実戦でも使います。
例えばAのサブクラスCを作り、Aにメソッドを追加し、サブクラスであるB,Cでそのメソッドをオーバーライドします。
List<A>の型変数を宣言した時にこのリストにはリスコフの置換原則からA,B,Cのインスタンスを格納できます。
このリストをfor文で全件操作し、メソッドを呼ぶとA,B,Cのインスタンスは自分が呼び出すべきメソッドを呼びます。これをポリモーフィズムと言います。

ポリモーフィズムの達成以外にも拡張性の良さなどいろいろあります。

投稿2016/02/21 14:09

編集2016/02/21 14:13
yona

総合スコア18155

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

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

0

オブジェクト指向プログラミングは、やってみったらわかるというのが多いので、まあそんなもんだと思って読んでください。

サブクラスをスーパークラスの方で受け取るのは、スーパークラスのと一緒くたに使いたいし、サブクラスのメソッドもフィールドも使わないからです。もちろん、その必要があるときにはサブクラスで宣言する必要があります。

とはいえ例のように、newの左でスーパークラスが宣言を書くことはそんなに多くないです。
ポリモーフィズムを使うことが多いのは、スーパークラスを引数に持ったメソッドにサブクラスを代入する場面です。これを型毎にメソッドを作っていては、型宣言以外違いがないメソッドが大量に作る必要が出てきます。

どの型を使う方、場合によりけりですが、知らなくていいことは知らないままのほうがややこしくなくていいよねという感じをオブジェクト指向プログラミングから受けます。

投稿2016/02/21 08:01

iwamoto_takaaki

総合スコア2883

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問