• ベストアンサー

クラス、インスタンス、オブジェクトの区別

クラスが人間という種類だとしたら インスタンスが例えばAさん、Bさんという具体的な人のことで、 オブジェクトが誰でもいいけどとりあえず具体的な誰か という認識でいいでしょうか? だとしたらなんとなくイメージはできたのですが、もっとわかりやすい言葉が欲しいです。 どなたから説明してもらえませんか?

noname#190647
noname#190647
  • Java
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
回答No.3

オブジェクトは『振る舞いや状態を有しているなにか』ですよ。 例で考えたら、人間じゃなくても、そのようなものを有しているものはすべてオブジェクトです。 オブジェクト、クラス、インスタンスの解釈の順序が問題でしょうね。 インスタンスは確かにインスタンスかもしれませんが、それも1つのオブジェクトですよ。 オブジェクトが最も抽象的です。 その結果、あらゆるインスタンスをオブジェクトと呼称することが出来ます。 まあ『オブジェクト指向言語』ですから、当たり前ですね。

noname#190647
質問者

お礼

回答ありがとうございました。 分かりやすかったです。覚えておきます。

その他の回答 (2)

  • teketon
  • ベストアンサー率65% (141/215)
回答No.2

言葉的なものとしては、それでいいです。 それ以上も以下もなく、言葉を足しても冗長になるだけですよ。 //Human型のクラス class Human{  private String name;  public Human(String name){   this.name=name;  } } class Main{  public static void main(String[] args){   //Human型のクラスから作成したインスタンスAさん   Human A = new Human("Aさん");   //Human型のクラスから作成したインスタンスBさん   Human B = new Human("Bさん");  } } //クラスHuman、インスタンスA、B、実行用のクラスMainは全てオブジェクトと呼べる。

noname#190647
質問者

お礼

なんとなく分かってきました。 回答ありがとうございました。

  • lv4u
  • ベストアンサー率27% (1862/6715)
回答No.1

しばらく前にプログラミングの世界で「オブジェクト指向」ってのがIT業界で大流行しました。 そして、質問者さんが書かれたような、クラス、インスタンス、オブジェクトを、車や動物とかタイ焼きの例で説明する文章がいろんな雑誌・書籍に書かれていたものです。 「なんとなく納得させられるけど、よくわからない・・・」って、それらの解説を読んで、私も思ったし、たぶん多くの方も同じように感じていたと思います。 日経BP社より「オブジェクト指向でなぜつくるのか」という書籍を見ると、このような説明で理解しようとするのは、「オブジェクト指向の理解を妨げることになる」と書かれています。 この本の目次を紹介すると 1章.オブジェクト指向はソフトウエア開発を楽にする技術 2章.オブジェクト指向と現実は大違い 3章.OOPを理解する近道はプログラミング言語の歴史にあり 4章.OOPは無駄を省いて整理整頓するプログラミング技術 5章.メモリの仕組みの理解はプログラマのたしなみ 6章.OOPがもたらしたソフトウエアとアイデアの再利用 7章.汎用の整理術に化けたオブジェクト指向 8章.UMLは形のないソフトウエアを見る道具 9章.現実世界とソフトウエアのギャップを埋めるモデリング 10章.擬人化して役割分担させるオブジェクト指向設計 11章.オブジェクト指向設計から生まれた素敵な開発プロセス 12章.オブジェクト指向を使いこなそう となっています。 そして、1章にて、質問者さんの読んだような説明で理解することは、混乱を増すことになると指摘されています。 そして、「オブジェクト指向でなぜつくるか」というタイトルで一冊の本ができあがるように、ここで回答できるような分量での説明は困難ですし、それをやったとしても、ほんとうのところは分からないと思います。 それは、泳ぎ方の説明みたいなものです。言葉で、書籍で「泳ぎ方」の説明を読んでも、写真をみても自分が泳げるようになることが無いのと同じです。 実際にプール、川、海で泳がない限り、泳げるようになれないのです。 そして、Javaという言語は、メモリの仕組みをできるだけ隠そうとした言語です。ですので、5章の内容からすれば、オブジェクト指向を理解したければ、メモリの仕組みを理解するのが必須であるC言語を学ぶほうが適しているという考え方も出てくるのです。 なお、3章では、構造化プログラミングの課題として、「残された課題はグローバル変数問題と貧弱な再利用」があげらえています。この問題の解決手段としてオブジェクト指向言語が出てきます。 ただし、オブジェクト指向だけでは、この課題の解決が十分にうまくいったように思えません。時々、「システム開発にオブジェクト指向の言語を採用した。でも、生産性は上がらず、かえって低下してしまった!」という嘆きが雑誌て紹介されたりしたものです。 実際のところ、オブジェクト指向言語で開発されたプロジェクトが2年以上かけて行われ、市場に投入する寸前のベータテストで、現場からの変更依頼を取り入れることが困難との判断が出て「発売中止!」となってしまったことがあります。これは、オブジェクト指向言語が悪いというより、「新しいソフト開発の目指すもの」の議論を十分に行わず、単に「オブジェクト指向で作るから変更が容易になる」という開発部隊の希望でスタートしてしまったことが問題であり、「要件定義」が甘かったのだと言えるかもしれません。(会社としては、数億円の損害となったみたいです・・・) ただ、開発プロジェクトに参加したプログラマの立場からすれば、「オブジェクト志向言語を下手に使うと、生産性が大きく悪化する」ということを身にしみて感じたものです。 ということで、質問者さんへの回答にはなっていませんが、さしあたり、上記で紹介した書籍を読んでみてください。 そして、本を読むだけでなく、実際にJavaやC++、C#などで、簡単なプログラムを作ってみることです。そうすれば、オブジェクト指向のことが分かってくると思います。

noname#190647
質問者

お礼

回答ありがとうございました。 機会があれば作ってみます。 他のプログラミング言語も頑張ります。

関連するQ&A

  • クラス、オブジェクト、インスタンス、メソッドについて。

    クラス、オブジェクト、インスタンス、メソッドに ついて教えていただけないでしょうか? 今現在の自分の認識では、乗り物を例にすると、 「乗り物」という大枠がクラス。それを、たとえば 飛行機なり電車なり船なり、より具体的にした ものがインスタンス=オブジェクト。 その具体化したものの挙動、動作(走るとか飛ぶとか) がメソッド、という理解です。 ただ、これだとオブジェクトとインスタンスを 同じものとして見てしまっているので、この2つの 違いを明確に説明しろと言われると困ってしまいます。 インスタンスとオブジェクトの違いを明確にした上で うまく伝えられる方法があれば、ご教授ください。

  • クラス?オブジェクト?インスタンス?何がなんだか・

    一般的なオブジェクト指向の 定義として下記で合っているのでしょうか お願いします クラス:第2実体(人間) インスタンス:第1実体(例:山田) オブジェクト:色々なインスタンスをさして、抽象的に総称としてオブジェクト 例えば・・クラス:人間、インスタンス:山田 クラス:犬、インスタンス:ゴン 違うクラスのインスタンスをまとめて呼ぶ際にオブジェクト? よく分からなくなっています、よろしくお願いします

  • UMLでの「オブジェクト」と「インスタンス」の違い

    Java的な概念での説明や、単に「オブジェクト指向」と銘打つHPなどの説明では、「オブジェクト」と「インスタンス」は同じものとして扱われたり、「クラスオブジェクト」「インスタンスオブジェクト」等という言葉を持ち出し、単独の「オブジェクト」という言葉は存在しないなどと取れる説明をしていることが多いように感じます。 しかし、一般的にUMLを元にしたオブジェクト指向の考え方の下では「オブジェクト」と「インスタンス」という言葉は明確に使い分けられており、また「クラス」と「オブジェクト」は対極にあるものとして扱われるため、「クラスオブジェクト」等という言葉が使われることもありません。 下記URLと書籍では、「オブジェクト」と「インスタンス」を明確に使い分けています。 http://www.atmarkit.co.jp/fjava/devs/object04/object04.html テクノロジックアート UMLモデリングL1 P2,3 しかし、この使い分けのニュアンスの違いが理解できません。 オージス総研 初めて学ぶUML 21P では、「型/インスタンス」→「クラス/オブジェクト」という明確な解を提示していますが、微妙な感じだし、何より前出の2者とは明らかに異なる意味合いで使われています。 人によって異なる意味合いで使われているということは理解しています。また、その人による微妙な違いもおおむね理解しているつもりです。しかし、上記の2者のニュアンスだけは理解できない状態です。このニュアンスがわかる方、解説よろしくお願いします。

  • インスタンスとオブジェクト 生成

    クラスのオブジェクトを生成するときに(newをつかって) ●インスタンスを生成する。 ●オブジェクトを生成する。 と参考書に書いてありますが、言い方はどちらでもいいそうです。 でも、2種類の言い方がるということは厳密には意味が違うような気がするのですが、皆さんはどう思いますか? またどちらの言い方を使っていますか? どちらが正しいのでしょうか?

    • ベストアンサー
    • Java
  • php インスタンスとオブジェクトの呼び方

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

    • ベストアンサー
    • PHP
  • インスタンスオブジェクトとは何かについて教えて!!

    下記内容はあるサイトのインスタンスについての説明文です。 画像は、自分なりに理解したものです。 (1)メモリ上には記憶場所(=ポインタ)はない (2)var Aa = new Bb("13" , "smole");とscript内に追加されたことにより メモリ上に記憶場所(=ポインタ)が作成され、 BbオブジェクトつまりBb("13" , "smole");がその記憶場所(=ポインタ)に入る (3)そしてBb("13" , "smole");が入った 記憶場所(=ポインタ)にAaという名前を付ける。 考え方に間違いがあるでしょうか? ---------------------------------------------------- var Aa = new Bb("13" , "smole"); これは、BbクラスオブジェクトのBbコンストラクタをnew演算子を利用して起動しています。 new演算子は、メモリ上に記憶場所を確保して、Bbオブジェクトを作成した後、そのポインタを返す演算子です。 new演算子から返されたポインタは、Aaへ格納されます。この場合のAaをBbオブジェクトのインスタンスといいます。 また、new演算子でメモリ上に記憶場所を確保して作られたオブジェクトをインスタンスオブジェクトといいます。 つまり、 オブジェクト == インスタンスオブジェクト で、 インスタンス != インスタンスオブジェクト インスタンス != オブジェクト です。 ----------------------------------------------------

  • インスタンスとオブジェクト

    こんばんは。 変数について教えて下さい。 プログラム自体が初めてなので 「たのしい Ruby 第3版」を読んでいます。 ずっとインスタンスとオブジェクトの違いが曖昧なままです。 その本の「クラスとモジュール」という章にて クラスを定義する構文。 インスタンス変数とローカル変数の違いですが、 以下の説明で一部理解できずにつまずいています。 ―――――――――――― @ で始まる変数は インスタンス変数 といいます。 ローカル変数はメソッドごとに異なる変数として扱われますが、 インスタンス変数は同じインスタンス内であれば、 メソッド定義を超えてその値を参照したり、変更したりできます。 なお、初期化されていないインスタンス変数を参照すると nil が得られます。 インスタンス変数は、インスタンスごとに違う値を持つことができます。 またインスタンス変数は、 インスタンスがある間は値を保持しておいて 何度でも利用することができます。 一方、ローカル変数はメソッド呼び出しごとに新しく割り当てられるため、 メソッドから抜けると値を忘れてしまいます。 ―――――――――――― ここで分からないのは、 ・ローカル変数が "メソッドごと" に異なる変数として扱われる ・インスタンス変数は同じ "インスタンス内" であれば、 メソッド定義を超えてその値を参照したり、変更したりできます の部分です。 Webで検索してますが、 プログラミング経験ありを前提で書かれているような。 他の言語も知らないので分からない、そんなページが多いです。 人に聞くからには 自分でも頑張って理解できるように考えますので、 どうか回答よろしくお願いします。

    • ベストアンサー
    • Ruby
  • クラスの練習をしています。

    ある方から、「参照(もしくはポインタ)を使って、人オブジェクトがまるで建物オブジェクトAから建物オブジェクトBに移動したようにしなさい」と言うお題を頂きました。 「生き霊」がなんちゃらとも言ってたのですが、 私は、人クラスを例えばmainでインスタンス化して、その実体をコピーさせて建物クラスAと建物クラスBにそれぞれ置き、それらを同期させてみてはと考えたのです。 初心者なので説明が難解してると思いますが、もし意図しているものが汲み取れた方がいらっしゃったら、 クラスの参照(もしくはポインタ)の扱い方(?)を教えてください。

  • 同一クラスインスタンス名で別クラスのインスタンス作成方法(C++)

    下記ソース(Java)の処理をするような、C++の実装方法を教えていただきたいです。 【処理内容】 クラスBのインスタンスを保持しており、クラスBのインスタンス名と同一であるクラスAのインスタンス生成 ClassA A_Instance = (ClassA)Class.forName(B_instance.name).newInstance(); 要はクラスインスタンスの名前の求め方がわからないのです。それさえわかれば、newしてクラスポインタを返すメソッドを用意すれば何とかなると考えていますが。 ※C++のAPI一覧はどこにあるのだろうか・・・

  • 別のクラスのインスタンスの作り方

    現在、javaからrubyに移行するために勉強しているのですが、別のファイルに定義したクラスのインスタンスが作成できなくて、困っています。 具体例をあげると require './B' class A end def initialize b = new B end end --別のファイル class B def initialize p 'hello' end  public : initalize end こんな2つのファイルがあったとして、Aのインスタンスを作成すると、 undefined method `B’ というエラーがでます。 私としてはこのエラーの原因がinitializeがデフォルトでprivate宣言なのが原因だと考えているのですが、publicと指定してもエラーとなることから、いくつか疑問が湧いたので質問させていただきます。 1、そもそもBクラスのインスタンスが作成できないのはinitializeがデフォルトでprivate宣言なのが原因なのか? 2、1があっていたと仮定するとBクラスのinitializeをpublic指定しているのになぜ呼び出せないのか? 3、rubyはなぜデフォルトでinitializeがprivateなのか?(javaではコンストラクタをprivateにするということは普通はしない。使うときはシングルトンやUtilのようなクラスを作るときに限る) 以上です。よろしくお願いします。

    • ベストアンサー
    • Ruby

専門家に質問してみよう