• ベストアンサー

オブジェクトの作成

あるHPで以下のようなことがかかれていました。 ------------------------------------------------- この例では Java 環境ですでに存在するクラスからオブジェクトを作成する。しばしば、 Java オブジェクトは次のような文で作成される。 Date today = new Date(); これにより、新規 Dateオブジェクトが作成される。 ------------------------------------------------- で、どれがオブジェクトなんですか? todayがオブジェクトなんでしょうか? BASICならわかるのですが、オブジェクト指向ってさっぱりまかりません。だれか助けてください。

  • Java
  • 回答数6
  • ありがとう数8

質問者が選んだベストアンサー

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.1

today がオブジェクトです。ちなみに、Date がクラス。 より、正確に書くと new Date() で、どこか知らないところに作成された オブジェクトを指し示すもの(参照という)が today です。 無理矢理日本語で直訳すると、 クラス Date をさす変数を today という名前で宣言し、その初期値に クラス Date のオブジェクトを新規作成して、その参照を設定する。 かな。 # かえって、わかりにくい? (^^; 因みに、もっと正確に書くならば、「オブジェクト」とは言わず、 「インスタンス」といいます。

holydevil
質問者

お礼

todayがやっぱりオブジェクトだったんですね。 ありがとうございます。

その他の回答 (5)

回答No.6

良い比喩がもう出てるようですが、わたしからも一点。 変数とオブジェクトは同じもの。 ちょっと乱暴かもしれませんが、そう思っておいてもかまわないと 思います。いや、もちろんtodayは実際にはtodayというオブジェ クトの実体というよりその参照、例えるならアイコン、目印、 ポインタ、WWWページに対するURLみたいなものですが。 そのオブジェクトに対してお願いする(メッセージを送る)基本的 には唯一の窓口ではあります。 # 本当は「変数=オブジェクトの1形態であるインスタンス」で # それとは別にnewでどこかに代入しなくてもクラス自体におねが # いできる場合もあるのですが、ややこしくなるのでやめておきましょう。 Date yesterday = new Date(); だとデフォルトのDateオブジェクトがyesterdayという名前ででき るだけなので、さらにこのあと昨日の日時になってくれるよう お願いをyesterdayに対してしなければなりませんが、最初に Date()のところで初期化用の値を与えて、そう、文字どおり 初期化させることもできます。どっちのやりかたをサポート するかはクラスの設計によりますが、たいていどちらもあったり します。 効率の問題から、intなどよく使うものについてはBASIC流の 値そのものをもつような形にすることができますが、むしろ そちらのほうが特別で、基本的には、上記のようにすべての 変数がなんらかのオブジェクトである、と考えたほうがよい でしょう。

holydevil
質問者

お礼

ようやく、オブジェクトというものが見えてきました。 あとは、多くの例文に触れて、学んでいきたいと思います。ありがとうございました。

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.5

> 変数とオブジェクトの違いをはっきり区別して理解したいのですが、何かいい例えありますか? Java は、システムが大きな紙で、ページ数もたくさんある本を持っています。 その本は、利用者が自由に見ることができません。 オブジェクトを new するということは、その本の空いているページを探して、 指定したクラスの情報と、どういうクラスで使っているよ、と言うことを書き 込みます。これが、オブジェクトを生成する、ということにあたります。 その本は、利用者が自由に見ることができないので、「何ページに書いたよ」と いうことを new は返してくれます。 ページ数をメモっておかなければ、後で、そのページを見ることができないので 変数にメモっておきます。 利用者も、本を持っているのですが、一ページの大きさがとても小さいです。 なので、オブジェクト自体を書き込むことができず、Java のシステムが持っている 本のページしか書き込むことができません。 > 変数を初期化しているような感じに思えます 「オブジェクトが生成された場所を示すもの(このたとえだと、ページ数)で、 変数を初期化してるんです。 この「変数」というのは、正確には「参照変数」と言います。 オブジェクトを指ししめすだけしか能が無いやつです。 因みに、利用者が持っている本の一ページは小さいのですが、小さなデータなら 書き込んでおくことができるようになってます。その「小さなデータ」というの は、組み込みクラスと言われるもので、int や double なんかがそれにあたります。 整数を表現するのには、組込みクラスである int を使う方法と、(普通の) クラス Integer を使う方法があります。 int を使う、ということは、手元の小さい本に直接値を書き込んでおくことに 相当します。クラス Integer を使うということは、Java が持っている大きな 本に、Integer 用のページを確保して、そこに値が書き込まれます。手元の本 には、その大きな本で使っているページ数だけが書き込まれます。 # 私が、ポインタ(参照)のことを説明するときに良く使うたとえです。 # わかりやすいかどうか、については、いまいち、自信がありません (^^; # でも、回答に対する自信には、「あり」にチェックをつけるけど

holydevil
質問者

お礼

組込みクラスである int を使う方法と、(普通の) クラス Integer を使う方法の違いを、わかりやすく説明していただきありがとうございました。今後ともよろしくお願いします。

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.4

#2の ymmasayan です。 > なんとなくイメージがつかめてきたんですが、この式の場合、変数を初期化しているような感じに思えます。(todayが変数として)考え方間違っています? むしろtodayという代表名でメモリーを確保してそこにクラスをコピーしたと考えるべきでしょうね。 当然 プロパティ(変数と考えていいでしょう)は初期状態ですね。メソッドは既にコピーされています。 因みに、プロパティの初期化は通常 init関数 で行います。  new → init のワンセットで独り立ちできるオブジェクトが完成することになります。 最後に、例えが説明不足でしたが、new で車の骨格を作り、init で塗色や内装を整えて、完成車になるという感じでしょうか。車が「走る」というのはメソッドですから、new の時点で走る機能が備わっている必要が有ります。

holydevil
質問者

お礼

わかりやすい説明ありがとうございました。独り立ちできるオブジェクトを作る必要があったんですね。

回答No.3

じゃあ僭越ながら私も補足を。 いっそ、オブジェクトの比喩として、「ファイル」とか「コマンド」 アプリケーションソフトの「アイコン」だと思うといいかもしれません。 なにかやってくれるかたまり。 Netscape myNetscape = new Netscape(); とすると、Netscapeというソフトを新しくひとつ作ってコピーした ことになる、と考えてみましょう。myNetscapeがアイコンです。 中身はよくわかんないけど、これをクリックしてなにか動かしてみたり 終了させてみたりすることができる。 そのDateの例も、todayというアイコンが産まれたのです。 Date yesterday = new Date(); これでyesterdayというオブジェクトが産まれた。 でも、この状態だとただ初期状態のやつを二つ作っただけだから、 それぞれのプロパティを設定して実際の今日とか昨日の時刻を 設定してやらなきゃいけない。 そして、これができると、それぞれを比べてみたり他のソフトに 組みこんだりすることができる。 ゴージャスな時計だと、このDate型オブジェクトを二つも三つも 抱えてるかもしれない。その時計自体も時計オブジェクト、という ものになりますね。 # ところで、「オブジェクト=インスタンス」でとりあえずいいと思いますが、 # 「クラスメソッド」なんてものが出てくるとまた混乱しちゃいそうですね…。

holydevil
質問者

お礼

ありがとうございます。だんだんわかってきたような・・・ 変数とオブジェクトの違いをはっきり区別して理解したいのですが、何かいい例えありますか?

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.2

a-kuma さんの回答で完璧と思いますが、多少素人わかりのする補足を。 オブジェクトを車だと仮定します。車名を例えばクラウンとすると、クラウンの設計図がクラウンというクラスです。設計図をもとに顧客の注文に合ったクラウンを1台生産します。これがオブジェクト(インスタンス:実体)です。オブジェクト指向では設計図と実際の車の両方をまとめてオブジェクトと呼んでいます。(私の理解)・・・設計図も実車もクラウンでひとまとめ。 ということで本題に戻ります。 Date:クラウン、today:車台番号 と考えると Date today = new Date() は「クラウンの設計図を使って新しい車を1台作り(右辺)、todayという車台番号を持った、顧客の注文通りのクラウンが誕生した(左辺)」ということになります。 却って、判りにくいでしょうかね。

holydevil
質問者

お礼

なんとなくイメージがつかめてきたんですが、この式の場合、変数を初期化しているような感じに思えます。(todayが変数として)考え方間違っています?

関連するQ&A

  • Dateオブジェクトの大小比較のしかた?

    こんにちは,よろしくお願いします。 Dateオブジェクトを次のように作成しました。 var today = new Date(2008,8,21); var theday = new Date(2008,8,21); このようにすれば,同じ日付になると思うのですが, if(today == theday){ alert("=="); }else{ alert("!="); } として,判定すると != が表示されます。Dateオブジェクトの大小判定(日付の前後の比較)はどのように行うのでしょうか?(できないのかな???) 教えていただきたいと思います。よろしくお願いします。

  • オブジェクト指向の教え方

    新入社員にJavaを教えているところなのですが、オブジェクト指向プログラミングをどのように教えていいか困っています。 全員がC言語研修を受講済みで、さらにJava言語も、継承やオーバーロード、例外まで一通り教えて、一応理解しています。 そこで、次のレベルとして、C言語風のプログラミング(「プログラム=関数の集まり」の考え方)から、オブジェクト指向(「プログラム=オブジェクトの集まり」の考え方)に意識改革させたいところです。 問題領域をオブジェクトの集まりとしてとらえ、そこからクラスを抽出していく、という説明がよくありますが、 「何をオブジェクトにするのか」「どのようにクラスを抽出したらいいのか」の部分を詳しく教えたいのですが、どのように説明したらいいでしょうか。また、参考になるWebサイトなどありませんでしょうか? 自分が普段作るときは、ほぼ「勘」でクラス設計していますので、それでは教えられなくて困っています。よろしくお願いします。

    • ベストアンサー
    • Java
  • VBがオブジェクト指向言語でない理由

    一般的にVBはオブジェクト指向ではない(VB7でその方向へ向かう)といわれていますが、実際にVBをさわり始め、いろんな本を読んでみると、 1)クラスが作成でき、構造体と関数を1つにまとめ、メンバ(プロパティ・メソッド)を定義付けできる 2)Implementsステートメントでクラスの継承が出来る と、ある程度のオブジェクト指向言語の要件を備えているように見えます。 といっても私はJAVAもSmallTalkも知らないので、「何が真のオブジェクト指向か」というのを良く判っていないのかも知れないのですが。 しかしC++関連書などを読んでいると出てくるクラスの使用例などはVBのそれと大差なく、なぜクラスの作成もできて、継承も可能なVBがオブジェクト指向ではないのか? という疑問がわいてきました。 JAVAとは何が違うのか? これが出来ないからオブジェクト指向ではないのだ! という理由をご存じの方、回答もらえればうれしいです。

  • 【オブジェクト指向について】

    【オブジェクト指向について】 こんにちは。初めて質問をさせていただきます。 さて、ただいまVBを勉強中なのですが、オブジェクト指向のところで躓いてしまいました。 質問したい事は以下の点です。 (1) オブジェクト指向の理解について   オブジェクト指向とは、プログラミングをするときに変数や機能などをクラスというものに格納しておくことで、プログラミングを円滑にすすめるための概念であると理解していますが、この理解は正しいのでしょうか? ご回答お待ちしております。よろしくお願いいたします。

  • php インスタンスとオブジェクトの呼び方

    new obj = new Test(); という一文は、 「Testクラスのオブジェクト、objを作成している」という考えを持っています。 オブジェクトは物という概念で、 「Testクラス を new して、objインスタンスを作成している」 というのが正しいのでしょうか? 【objを Testオブジェクトと呼ぶのは間違っているのでしょうか? objは Testインスタンスと呼ぶのがやはり正しいのでしょうか?】 知り合いにも、インスタンスではなくオブジェクトと呼んでる人が多いのでわからなくなってきました。 ご教授お願いします。

    • ベストアンサー
    • PHP
  • WEBシステム作成でのオブジェクト指向の無駄について

    データベースを使用したWEBシステムの作成に、オブジェクト指向は非効率なだけだと思います。 まず、クラスを使用しない方法(include文などは使用)で作成したPHPデータベースプログラムと 同じシステムを、オブジェクト指向で作ろうとすると、かなり分かりにくいコードになると思います。 さらに、作成をしたシステムの改良やデバックにかなりの時間がかかります。なぜなら、プログ ラム上の変数の動きが非常に把握しにくいからだと思います。 プログラムの再利用なら、よほどよく使う部分や、セキュリティ上必要なところを、include文などで 管理をすれば良いと思うのです。 C/Sシステムやゲーム等ならともかく、WEBシステムでは、すでに、一つ一つの動作にプログラム ファイルが必要なのに、それをさらにクラスに分けて、変数をあちらこちらに飛ばす作りは分かりず らいと思います。 複数人で作成をする時も、WEBシステムでは、オブジェクト指向よりも各ページファイルの動作 プログラムの部分をお互いに担当していった方が、効率的で、またエンジニアもやりがいが出る と思います。 ただ、複数人で作成をする時は、プログラムで使用した変数の用途や概要などの一覧表などは、 あった方が良いと思います。 WEBシステムの作成でオブジェクト指向ではない方が効率的に感じている人で、他にも意見があ る人は教えてください。

    • 締切済み
    • PHP
  • 宣言とは違うオブジェクトを作成???

    初心者です、、、教えて下さいm_ _m 宣言したクラスと、実際に作成するオブジェクトが違うというのはどうゆう意味なんでしょうか? 例えば、 Sample01 s1 = new Sample02(); というような場合です…これの意味がわかりません。。。 というか宣言とは一体なんの役割があるのでしょうか? 宣言したクラスと作成するクラスが違うと矛盾などが起きたりしないのはどうしてなのでしょうか?

    • ベストアンサー
    • Java
  • オブジェクト指向、理解しやすい?

     最近、Javaの解説書や解説サイトを見ていて、しばしば、「Javaは完全なオブジェクト指向だから理解しやすい」といった記述を見かけます。(「プログラムが見やすくなる」とかではなく)  Javaに限った話ではないのですが、個人的に、オブジェクト指向の概念は、プログラミング初心者の最大の関門ではないかと勝手に思っています。僕はPHPから入ったのですが、ある程度基本事項をマスターした後も、オブジェクト指向だけは長い間苦手としてきました。(最近やっと慣れてきたところです。)  そこで伺いたいのですが、最初にやったプログラミング言語がオブジェクト指向だったという方、オブジェクト指向の概念は、 1.わかりやすかった 2.そこでつまずいた 3.特に意識せずに通り過ぎた 4.その他 いずれでしょうか? ※最初にJavaについて書きましたが、これはただの例なので、オブジェクト指向言語全般についての質問であるととらえてください。

  • オブジェクト指向モデルの抽象化について

    下記の設問について質問です。 設問:次の文が正しいか否かを答えよ 「オブジェクト指向モデルでは、抽象化の対象となるオブジェクトの操作をあらかじめ指定しなければいけない」 ~~設問以上~~ まず前提知識として抽象化というのはクラス、メソッドの名前だけを、 中身は何も書かないで予め宣言しておくことという理解でよいでしょうか。 その場合、上記「」内の文で誤っているところとしてはオブジェクト指向モデルでは抽象化は必ずしも必要ないから誤っているという理解でよいでしょうか。

    • ベストアンサー
    • Java
  • オブジェクトの生成について

    プログラムの勉強中です。オブジェクト指向でオブジェクトを生成するのに 以下のような複数の方法があるのですが、 何が違うのでしょうか。またどのようにして使い分けをしたらよいでしょうか。 Object obj1 = new Object(); Object obj2 = Object.Create(); Object obj3 = XXX.getObject();

    • ベストアンサー
    • Java

専門家に質問してみよう