Java初心者です。

Javaの書籍で、ポリモーフィズムを説明している箇所において
オブジェクトを生成する際に、以下のような書き方をしているのを見ます。

1.-----
スーパークラス名 オブジェクト名 = new サブクラスのコンストラクタ名();
--------

上記は、
何を実現する為に、左辺と右辺のクラス名とコンストラクタ名を変えているのでしょうか?
(もちろん詳細は実際に書かれたメソッドや変数によると思いますが、一般的な話として。)
また併せて、

2.-----
サブクラス名 オブジェクト名 = new サブクラスのコンストラクタ名();
-------
と書いた時とでは、使用(アクセス)出来るメソッドや変数、
生成されたオブジェクトの中身が、どのように変わってくるのでしょうか?
2.の方法では、何が実現出来ないのでしょうか?

教えて下さい!

このQ&Aに関連する最新のQ&A

A 回答 (5件)

>これは、


>-----
>ArrayList list= new ArrayList();
>-----
>と書いても同じだと感じるのですが、違うのでしょうか?
>この辺りがちょっと分かっておりません。
>
>こう書けばいいものをナゼわざわざ
>List list= new ArrayList();
>って書くのかな~と、、、
>初心者なんで細かいところで足踏みしてしまうのです。。。

まず、開発というものは非常多くの事を考慮して行います。
その考慮を推し量れないとこのような疑問が出てくるのだと思います。
その理由はこの一行だけでは誰もわからないでしょう。

>List list= new ArrayList();

この一行だけで意味を見つけるのだとしたら、
listというオブジェクトに制約を設けるためです。
インターフェースは定義だと前のレスで書きましたが、
このインスタンスはListというインターフェースの定義で使用する
事を強要するという事です。
この場合はArrayListのインスタンスであるにも関わらず、
Listに無いメソッドやグローバル変数にはアクセスができなくなります。

コードというものは様々なコードとの整合性を考える必要があります。
そういいた意味で、この一行だけでなくプログラム全体を見通した時、
>List list= new ArrayList();
という一行に意味を持つ事もあります。

これ以上の説明は設計という作業に関係してきます。
まさに題名の「ポリモーフィズム」とはそういう類のものです。
「インターフェース」「設計」などで検索をされてはいかがでしょうか?

あなたが探している答えは実際にこの書き方をされている
コードの中にあると思います。
    • good
    • 0
この回答へのお礼

>コードというものは様々なコードとの整合性を考える必要があります。
>そういいた意味で、この一行だけでなくプログラム全体を見通した時、
>>List list= new ArrayList();
>という一行に意味を持つ事もあります。

なるほど!そういった類いのものなんですね、ありがとうございます。

お礼日時:2011/04/29 12:08

ここで詳しい説明をするのは大変なので、キーワードだけ。



1) OCP(Open Close Principle)
2) 共通-可変性分析
3) 上位の共通化
4) 抽象化
5) 処理の違い=具象オブジェクトの違い

いずれもオブジェクト指向分析でアプリケーションの構造を決定するときに
用いられるものです。いずれもポリモーフィズムが関連します。

このあたりを調べると、ポリモーフィズムがオブジェクト指向を支えている
ものであることが判ると思います。
    • good
    • 0
この回答へのお礼

ありがとうございます!

学ぶべきキーワードを教えて下さると、次のステップにつながるので助かります!

Java、深いですね、、、おもしろいです。

お礼日時:2011/04/29 10:47

No.2さんの回答がしっくり来ますね。



>これは、java.io.Writer / java.io.Reader などがよく例に挙げられます。
>メソッドに引数には、スーパークラスで定義し、実装ではサブクラスを与えるといった使い方です。

ただ、この部分ですが、
この記述はインターフェースこ事だと思われます。
サブクラスは機能拡張、インターフェースは定義ですから。


あくまで私の使用例ですが、
1.の場合はポリモーフィズムにて、インスタンスを持たせたオブジェクトメソッドの
処理内容を切り替えたいときに使用します。
例えば、ある条件ではスーパークラス(インターフェース)ではなく
サブクラス(実装クラス)のオーバーライド(実装)された同名のメソッドを使用するということです。
これはインターフェースとしての使い方です。
サブクラスは既存クラスに対し、何らかの追加機能をする時や既存機能を
改ざんしたい時にのみ使用します。
例えば、ArrayListを使用しているプログラムにデバッグ用に中のデータを表示したいとします。
そのためにdebug()というメソッドを追加してSystem.outへ内容を出力させる処理を追加。
というような使い方ですね。
この場合、ArrayListを継承しているため、コードの変更は不必要になります。

ArrayList list = new DebugableArrayList();
list.add("a");
((DebugableArrayList)list).debug();

のような使い方ですね。


2.についてはそもそも普通の使い方がありますので特に意識はしません。

>と書いた時とでは、使用(アクセス)出来るメソッドや変数、
>生成されたオブジェクトの中身が、どのように変わってくるのでしょうか?
>2.の方法では、何が実現出来ないのでしょうか?

例えば、

List list= new ArrayList();

とした時を考えてください。
list.add("a");
とした時に呼び出されるaddの処理はListではなくArrayListのaddの処理が呼び出されます。
ちなみにもし、Lsitのaddを呼び出したい場合は実装クラスのaddメソッド内で
super.add()という処理を書けばアクセスできます。
(Listはインターフェースなので処理は実際に書かれていないのでが・・・)

何が実現できないとかというよりも目的が違います。

本当はこの技術については非常に高度な設計が絡んできますのでこの場所で説明は無理です。

この回答への補足

皆さんご丁寧に回答して下さって、本当にありがとうございます!

covachan様から頂いた回答に更に質問ですが、

>例えば、
>
>List list= new ArrayList();
>
>とした時を考えてください。
>list.add("a");
>とした時に呼び出されるaddの処理はListではなくArrayListのaddの処理が
>呼び出されます。

これは、
-----
ArrayList list= new ArrayList();
-----
と書いても同じだと感じるのですが、違うのでしょうか?
この辺りがちょっと分かっておりません。

こう書けばいいものをナゼわざわざ
List list= new ArrayList();
って書くのかな~と、、、
初心者なんで細かいところで足踏みしてしまうのです。。。

補足日時:2011/04/25 23:10
    • good
    • 0

一般的にプログラミングを行う上では、


2.の書き方をしても、1.の書き方をすることは滅多にありません。
使用するスコープ内で、わざわざスーパークラスにダウンキャストしても、
使用できるメソッドが制限されるデメリットのみで、得られるメリットはありません。
書籍上で、機能の説明をするために記述してあると考えられます。

2.の記述では出来て、1.の記述でしかできないことはありませんが、その逆はあります。
実際に生成されたオブジェクト (インスタンス)の内容が変わるといったことはありません。

では、どういう時に例題のようなポリモーフィズムを利用するかというと、
メソッドや、コンストラクタの引数に利用する際です。
これは、java.io.Writer / java.io.Reader などがよく例に挙げられます。
メソッドに引数には、スーパークラスで定義し、実装ではサブクラスを与えるといった使い方です。

他にも、もう少し高度になると Factory を使用した際にも有効になります。
これは、Springframework や S2 といったフレームワークを使うようになると、
その利便性が体感できると思います。
    • good
    • 0

例えば



「学校の関係者」
というスーパークラスがあります
サブクラスとして
「教師」「生徒」「PTA」なんかがあります。

「学校の関係者」 田中先生 = new 「教師」();
「学校の関係者」 山田さん = new 「生徒」();
のような感じですか。
これは、処理の中で「学校の関係者」であることを求められているときに利用します。
つまり、田中先生や山田さんが教師だろうが生徒だろうが関係ないような場合ですね。
例えば「学校の関係者」共通の権限の判定に使ったりします。
他にも「学校の関係者」には共通のメソッドがあり
その結果だけが重要でその処理内容はどうでもいい場合にも利用します。

「教師」 田中先生 = new 「教師」();
「生徒」 山田さん = new 「生徒」();
こうする場合は、処理の中で教師であること、生徒であることを明確に区別する必要があるときに利用します。
例えば「教師」特有「生徒」特有の権限の判定に使ったりします。
他にも「教師」や「生徒」専用のメソッドを使うためにはこうしないと利用できません(キャストすれば別ですが)。


まあ、一番多いのはメソッドの利用ですね。
メソッド=権限ですし。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QIT関係で英語もそれなりに使う職種は何でしょうか?

現在、英語とITを勉強中です。
IT関係で英語もそれなりに使う職種は何でしょうか?

外資系にとても憧れを抱いているのですが、英語を使わない職場がほとんどでしょうか?
詳しい業界関係者の方々、どうかアドバイスをお願いします。

Aベストアンサー

いろいろ意見がありますが、私は英語はITでは最低必須の能力だと思います。
それなりに、ではないと私の仕事上は言っておきたい。
私の仕事はITコンサルタントです。

もちろん使わないで済む仕事についているITの人もいるでしょうからその人たちを否定するわけではありません。

TOEICいくつ以上という話ではありません。
TOEIC900でもネットワークの議論ができなければどうにもならんのです。

ということは、通訳を雇ったら大丈夫、ではないです。

だいぶ昔ですが、ある開発で私がこの方式ではできない、と日本の会社に言ったと思ってください。

ドイツの会社社長が飛んできて私と議論したいと言ってきた。
彼が日本に輸出して商売をしようとしていたから。

ここで日本の会社が雇ったドイツ語の通訳が入ったのですが、ぜんぜん役に立たない。
私は学生時代ドイツ語をやったことはあるので片鱗的にはわかるけどニュアンスは自信がないのでとりあえず任せた。
ところどころで私がビッテ、とか割り込みかけて冷静になろうやと身振りをしました。その程度です。

セマフォの問題を語ろうとしたら、割り込んで仕事をする効率というような言葉を通訳が出してきました。もう意味が飛んでます。
OSのタイムスパンの問題につなごうとしたら、時間割の話にされた。

私も怒ったけど、ドイツの社長も怒った。先方の言ったことも変に訳されたことがわかったから。
ドイツ人は日本語は全く知らなかったようですけど、通じていないことはさすがにわかります。
悪いけど英語で話をしようや、と先方が言ってきて通訳無視で議論を始めました。
あとはすんなりで、相手も頭から火吹いて怒ってきたのですがこちらの言うことを理解できたので悪かったと言いました。

英語が通じるならお互いに変な通訳要らなかったね、と言い合って、それは英語ですからドイツ語通訳にもわかったでしょう。

通訳なんかあてになりません。知っているものがそのコトバを使えなければだめなのです。

オープンソースというものがありますが、これらは全部英語で説明が書かれています。
翻訳プロジェクトなんていうものを立ち上げてドキュメントの日本語化をするひとたちは居ます。
でも、週に2度もアップデートが行われるようなものでどうやって追いつきますか。

学会論文はほとんど英語です。
オブジェクト開発だとかクラウドというのはすべて最初は学術論文で読みました。
マウスというデバイスが実現しそうだという話は学術論文ではなく業界紙だったと思いますけどやっぱり英語でした。
Xeroxの話でした。

オフショア開発というのがあります。
これは必ずしも英語でないところが重要です。
中国語とかベトナム語が必要になります。
このとき、「できない」からスタートしたら始まりません。
できるようにならなければだめなんです。
大体先方に日本語ができるSEが立ち上がってブリッジをしようとしますが、このブリッジを無条件に信じるのですか。
信じる人間も日本にはたくさんいますけど、相手の思うようにされていますね。

外国語はマスト事項であり、あったら便利という話ではありません。

いろいろ意見がありますが、私は英語はITでは最低必須の能力だと思います。
それなりに、ではないと私の仕事上は言っておきたい。
私の仕事はITコンサルタントです。

もちろん使わないで済む仕事についているITの人もいるでしょうからその人たちを否定するわけではありません。

TOEICいくつ以上という話ではありません。
TOEIC900でもネットワークの議論ができなければどうにもならんのです。

ということは、通訳を雇ったら大丈夫、ではないです。

だいぶ昔ですが、ある開発で私がこの方式ではできない、と日...続きを読む

QJAVA初心者(プログラミング初心者)

現在、転職を考えていますがオブジェクト指向の勉強をするにあたって
まず、何から始めればいいでしょうか?
先日面接時にオブジェクト指向の勉強をした方がいいと言われましたので。
プログラミングは全くの初心者です。

Aベストアンサー

方法論や言語間の違いはさておき、私の方は「転職」という観点から。

今だとやっぱしこれかな。

「Sun認定Javaアソシエイツ試験概要」の公式サイト
http://suned.sun.co.jp/JPN/certification/sjcadetails.html

今現在、Javaプログラマーになるためにスクールなどに通うとなると、大抵は「SJC-P」に関する勉強漬けになるかと思われます。もちろん、こちらの方は同じ「Sun Certified」でも『Associate』ではなく『Programmer』の方ですし、それ自体は否定しませんが、実際の所「SJC-P」ってUMLをまったく知らなくても合格できちゃうんですよね~。オブジェクト指向に関する資格試験なのに何故に?って感じです。(一応、私はA[310-019]もP[310-055]も両方、独学にて取得済みですが。)

ちなみに、私がSJC-Aを受験する際に利用した対策本は、これです。

「Sun SJC-A認定ガイドー310-019対応」
■ 株式会社クロノス 山本大、志賀澄人、山野寛、大伴明弘、田中征司、山田信人、芳賀浩司、舩木啓介著
■ 日経BP社
■ 2006年 8月28日 1版1刷
http://bpstore.nikkeibp.co.jp/item/main/148222828210.html

上記の本のp.17の上の方に、次のような記述があります。

「(中略)SJC-P資格試験は、Javaの構文やクラスの作成方法、Javaによるオブジェクト指向プログラミングの実現方法などを問う試験なので、上記のようなニーズに応えられないのも仕方ありません。しかし、エントリーレベルの認定資格であるはずのSJC-Pを取得しても、ソフトウェア開発で必要とされる十分な知識を持ったエンジニアであることを証明できませんでした。このような理由から、Java言語を利用したシステム開発への入門に必要な技術を体系的に学べるようにSJC-A認定資格が作られたのです。」

個人的には、そもそもオブジェクト指向なんて、本を一冊読んだだけではなかなか理解しづらいものがあるでしょうし(私自身、様々なJavaの技術を勉強していくうちに分かってきた、という感じです。)、今はとにかく「クラス図なら何でも聞いてください。」って言えるぐらいまで勉強し、その後からでも全然遅くはないと思います。

最後に、問われる知識をJavaだけに限定した場合、ランク的には以下のようになると思います。

SJC-A → 基本情報技術者(午後:JLS3.0) → SJC-P → ・・・

JITECの秋期試験の方も恐らく、7月の上旬以降に願書の受付が始まると思いますが、国家試験でもベンダー試験でも試験範囲が一部重なっていたりしますので、今のような真ん中の時期に、SJC-Aだけを短期集中でサクッと取得しておくのも手です。

方法論や言語間の違いはさておき、私の方は「転職」という観点から。

今だとやっぱしこれかな。

「Sun認定Javaアソシエイツ試験概要」の公式サイト
http://suned.sun.co.jp/JPN/certification/sjcadetails.html

今現在、Javaプログラマーになるためにスクールなどに通うとなると、大抵は「SJC-P」に関する勉強漬けになるかと思われます。もちろん、こちらの方は同じ「Sun Certified」でも『Associate』ではなく『Programmer』の方ですし、それ自体は否定しませんが、実際の所「SJC-P」ってUMLをまったく...続きを読む

Q英語関係のサイトでお勧めを教えてください。

英語関係のサイトでお勧めを教えてください。
国内で英語関係の便利なサイトや海外の読み物みないなのでも構いません。
(英語はまだまだ勉強中の身です)

Aベストアンサー

こんにちは!
英語関連のどのような事を知りたいのかにもよりますけど、単語調べるのであれば、
以下のALC 英辞郎を便利に使わせてもらってます。
(既にご存知かもしれないですね。)
このページは他にもいろいろ情報がありますので、
一度よまれてはいいかもしれません。

参考URL:http://www.alc.co.jp/

Qjava初心者(プログラミング初心者)です

最近「独習java」を読んだjava初心者です。
文法はだいたい理解したので、このサイトにあるプログラムのソースコードを読もうとしました。

http://www36.atwiki.jp/aial/pages/11.html

正直言って難しいです。手が付けれません。(C#で書かれていますが、文法は似ているので大丈夫だと思います)
しかし、大学での勉強に役に立つのでどうしても読めるようになりたいです。

文法を理解したぐらいではこのレベルのプログラムを理解するには早すぎるのでしょうか?
ではこれからはどういった勉強をすればいいのでしょう。

よろしくお願いします。

Aベストアンサー

Tierra を読みたいということは、人工知能や人工生命について勉強してらっしゃるのでしょうか。
まずはもっと理論的な背景について学ぶべきです。人工生命だけでなく、コンピュータアーキテクチャなど。
その上で、プログラムの実装を知りたいのであれば、もっと簡単な1次元のセルオートマトンや、ライフゲームなどを読まれてみてはいかがかと思います。

Q英語関係の専門学校&フライトアテンダント

英語関係の専門学校に行きたいと思っています。来月が受験なため、とても困っています。専門学校でフライトアテンダント科やスチュワーデス科というのがありますよね?もし、そこに入学する前の英語力はどれくらいまで必要ですか。専門学校の授業は英語中心と言うより航空関係やフライトアテンダント専門英語の方を勉強するらしくて、普通の英語や英会話中心ではないようです。そしてフライトアテンダントに就くには、TOEIC500点以上は必要だと聞いています。私の今の英語力ははっきり言って全然ダメに近いです。そこから、専門学校に行って500まで上げるのは大変でしょうか?学校に問い合わせてみると、クラス編成されてるから、大丈夫と言われました。でも、本当に大丈夫なのか不安です。直接、フライトアテンダント関係の学校に行ってる方にお聞きしたいです。

Aベストアンサー

 ご質問の趣旨とはずれてしまいますが、英語系の専門学校に行くのが目的なのでしょうか?それとも、フライトアテンダントになるのが目的なのでしょうか?
 現状から申しますと、専門学校のフライトアテンダント科からの就職はグランドであり、フライトアテンダントになってる人は殆どいません。また、各航空会社でも募集要項には「短大以上」となっており、専門学校はこれに該当しません。つまり、まずは大学に進学する事をお勧めします。
 また、以前はTOIEC500点以上が基準でしたが、現在は600点以上が最低ラインで、欧米路線に就くには730点以上となっています。大学の英文科が良いのではないでしょうか。

参考URL:http://www.geocities.co.jp/Milkyway-Orion/8808/high.html

Qjavaのエラー(java超初心者)

D:\Sample>javac Sample2.java
Sample2.java:7: \12288 は不正な文字です
  }
^
Sample2.java:7: \12288 は不正な文字です
  }
^
Sample2.java:7: ';' がありません。
  }
^
というエラーがでたのですが原因はなんでしょうか

Aベストアンサー

そのエラーの場合、
 セミコロン(;)の付け忘れ
 中カッコ({})の対応がとれていない
などがありますが、この他にも気付きづらいことですが、
インデントのつもりで「全角スペース」を使っている場合があります。
コンパイラはスペースやTABでのインデントは読み飛ばしますが、
全角スペースは解釈できずエラーを出します。
インデントが全角スペースになっていないかも確認してみてください。

Qこのasは(擬似)関係代名詞で、補語の役割をしていますか? 英語英語上智

このasは(擬似)関係代名詞で、補語の役割をしていますか?

英語英語上智

Aベストアンサー

黄色の"as"ですか?おっしゃるとおりです。

<節あるいはその一部を先行詞として>その一部がここでは主格補語(S=C)になっています。
補語格関係代名詞という呼び名は一般的ではありませんが、そういう働きをしています。

the Gold Coast --- as Ghana was then called ---
黄金海岸 --- ガーナは当時そう呼ばれていました(が) ---

QJAVA環境にインストールについて(JAVA初心者です。)

JAVA環境にインストールについて(JAVA初心者です。)
・JAVAでの開発が必要になったため、JAVA(SE)をインストールしました。
・PATH等を設定
・コマンドプロンプトからjavac -version を実行してバージョンが表示するのを確認しました。
次に、JDK内のdemoのapplets内のdemoを実行してみたのですが実行できませんでした。

まだ何かインストールするものが必要ですか?

あと、JAVA SE と JAVA EEの違いはなんですか?

なにぶん、JAVA生まれて初めてやるもので、上司から本を渡され、本を見て悪戦苦闘してます。
(その上司もJAVA全然知らなく、すべて私に押し付けています。)
何か参考になるHP等ありましたら教えてください。

よろしくお願いします。

Aベストアンサー

>次に、JDK内のdemoのapplets内のdemoを実行してみたのですが実行できませんでした。
とありますが、どのように実行してどのような結果になったのでしょうか?
それが具体的に分からないと回答しずらいです。

で、想像なのですが***.classを実行しようとしていませんか。
アプレットはhtmlに読み込んで実行するものなので、***.htmlをブラウザで開けば見れると思います。

appletviewerを使ってもappletの内容を確認できます。
このページなんかはどうでしょうか。
http://www.javadrive.jp/applet/

自分がjavaを始めた頃はここをよく見てました。
http://www.javaroad.jp/

Q英語ビジネスE-mailで「Cc:関係各位」と書くには?

英語ビジネスE-mailで「関係各位」に対してCcしたいときの表現をご存知でしょうか?

いつも日本語のメールでは、本文の冒頭にこのように書いています。(メールのヘッダーではなく、本文です。)
 To: 山田様
 Cc: 関係各位
 From: 鈴木 ←自分の名前

この「Cc: 関係各位」の英語での表現に困っています。
Toを関係各位にしたいときは、「To whom it may concern」という表現があるようですが、Ccにしたい場合はどうすればよいのでしょうか?

それとも英語ビジネスE-mailでは、あまりこのような表現はしないのでしょうか?

よろしくおねがいいたいします。

Aベストアンサー

関係各位=
To whom it may concern が最も標準で無難な一句だと思います(業務上)。
--------------------
方法1:
To:Mr.Yamada
To whom it may concern (この一行の行頭はMr.と揃える)
From:Mr.Suzuki

本文

Yours faithfully (結文)
Suzuki (自著名)
--------------------------------------------
方法2:
To:Mr.Yamada
From:Mr.Suzuki

本文

Yours faithfully (結文)
Suzuki (自著名)
(ここは一行以上空ける)
cc:To whom it may concern

QJavaの問題(初心者向け、やや計算あり?)

Javaの勉強中なのですが、以下のような問題が出ました。

ニュートンコーツの公式(のうちの台形公式)を用いて、y=xの2乗を0<=x<=1の区間で積分し、結果を表示するプログラムを作成せよ。刻み幅は任意に設定してよい。

…どのように解かれますか?
さっぱりわからないのですが…。

Aベストアンサー

y = f(x) において、x = x0, x1 (x0<x1)が作る台形の面積は、
 (上底の長さ) = f(x0)
 (下底の長さ) = f(x1)
 (高さ) = x1 - x0

だから、 その面積は S = ( f(x0) + f(x1) ) * ( x1 - x0 ) / 2
ここで、f(x) = x^2 ならば

 S = ( x0^2 + x1^2 ) * ( x1 - x0 ) / 2

これを、[0,1]の範囲で刻み幅を deltaX として加えていくと

public double getArea( double deltaX ) {
 double s = 0.0;
 double x0 = 0.0;
 for( double x1=deltaX; x1<=1.0; x1+=deltaX ) {
  s += ( x0^2 + x1^2 ) * deltaX / 2
  x0 = x1;
 }
 return s;
}

これで、中学生の知識で求めることができます。
なお、これはJavaのプログラミングの勉強には
全く相応しくない内容ですね!(^^;

y = f(x) において、x = x0, x1 (x0<x1)が作る台形の面積は、
 (上底の長さ) = f(x0)
 (下底の長さ) = f(x1)
 (高さ) = x1 - x0

だから、 その面積は S = ( f(x0) + f(x1) ) * ( x1 - x0 ) / 2
ここで、f(x) = x^2 ならば

 S = ( x0^2 + x1^2 ) * ( x1 - x0 ) / 2

これを、[0,1]の範囲で刻み幅を deltaX として加えていくと

public double getArea( double deltaX ) {
 double s = 0.0;
 double x0 = 0.0;
 for( double x1=deltaX; x1<=1.0; x1+=deltaX ) {
  s += ( x0^2 + x1^2 ) ...続きを読む


人気Q&Aランキング

おすすめ情報