• ベストアンサー

オブジェクトの作成

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

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

  • ベストアンサー
  • 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