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

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

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

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Java

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

7回答

20149閲覧

オブジェクトとインスタンスの違いがわかりません。(言語問わず)

k_mail

総合スコア90

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Java

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

2クリップ

投稿2016/08/06 05:11

オブジェクトとインスタンスの違いがわかりません。

以下はvb.netの本からの抜粋です。
グラフィックスの描画をするためのコードです。


ピクチャーボックスへのグラフィックス処理を行うためのグラフィックオブジェクトをgに取得する
グラフィックスオブジェクトgは、絵を描くキャンパスに相当する
Dim g as Graphics = PictureBox1.CreateGraphics()

Dim pen as new Pen(Color.Black)

g.DrawLine(mypen,x1,y1,x2,y2) //x1,y1は始点(描き始めの座標)、
// x2,y2は終点(描き終わりの座標)を表しています


疑問点としては、変数Penはnew でインスタンス化したものを入れているのに、
なぜ、変数g にはnewをしたものを入れなくてはいいのかです。

ネットで調べるとオブジェクトは型と書いていたのですが、
インスタンス化せずに型のままでは描画できないのではないか?
インスタンス化して初めて描画のためのオブジェクトが作成されるのではないか?
と疑問が残ったのでこちらで質問させていただいています。

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

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

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

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

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

guest

回答7

0

「言語問わず」とありますので、一般論から述べます。

プログラミング言語でオブジェクト(object)といった場合、その言語において直接扱える何かをさします。だいたい次のような性質を持っています。

  • 何らかの型がある。
  • 変数に代入できる。
  • 関数(メソッド)の引数にできる。
  • 関数(メソッド)の戻り値にできる。
  • それ自体が式であり、任意の式の一部となれる。

※ 静的型付けの場合は、型があっていればという条件があります。

つまり、言ってみれば何らかのデータです。整数であったり、浮動小数点数であったり、文字列であったり、構造体であったり、関数であったり、クラスのインスタンス(後述)であったり、言語によって様々です。これらの性質を直接持つ物を第一級オブジェクト、間接的に同様の事ができる物を第二級オブジェクトと言ったりします。

注意すべきは、オブジェクトはオブジェクト指向だけの概念ではないと言うことです。オブジェクト指向を考慮していないC言語でも整数(int等)や浮動点数少数(double等)、構造体(struct)等のデータはオブジェクトと言います。オブジェクト指向は、こういったオブジェクトを中心に据えてプログラミングする手法なので、オブジェクト指向と言っているに過ぎません。

なお、ここでのオブジェクトは型の事ではありません。何らかの型のデータ自体のことです。ただし、型自体がオブジェクトになる言語も存在します。

さて、次にインスタンス(instance)は、これはオブジェクト指向だけの概念です。クラス(プロトタイプベースの場合はプロトタイプとなるオブジェクトになりますが、以下クラスとまとめて考えます)はオブジェクトの雛形です。その雛形から実際のデータをもつオブジェクトにすることを実体化(インスタンス化)と言い、そのオブジェクトはそのクラスのインスタンスと言われます。

つまり、逆に言うと、インスタンスは何らかのクラスを実体化したオブジェクトであると言えます。インスタンスは常にオブジェクトです。しかし、オブジェクトが必ずしもインスタンスであるとは限りません。言語によってはクラス以外の型が存在し、クラスのインスタンスではないオブジェクト(よくプリミティブ型とか言われる)がある場合もあります。これは言語によって異なり、逆に全てが何からのインスタンスであるという言語もあります。

さて、ここまでは良いですね。こっからが混乱を招くかも知れないところです。言語によってはObjectというクラスが用意されている場合があります。だいたいは最も底にある基底クラスであり、全てのクラスはObjectクラスの派生にすぎないように設計されている場合があります。Objectもクラスですので、Objectクラスのインスタンスも存在します。これをObjectクラスのオブジェクトと言ったりします。

さらに、混乱することを言います。先ほどObjectクラスというものを見てきました。言語によっては、このようなObjectクラスまたはObjectクラスの派生クラスのインスタンスであるオブジェクトをまとめて「オブジェクト型のオブジェクト」と言ったりします。何言っているのかわからない…という感じですが、オブジェクト型では無いオブジェクトもある言語では、それらを区別するためにこのような表現を使います。

もう何が何だがわからない感じですが、実は英語の文章だったらはっきり違いがわかります。「オブジェクト型」と言った場合のオブジェクトはObject(固有名詞)ですが、単にオブジェクトと言ったときはobject(一般名詞)です。日本語の文章にしてしまうと英語の大文字小文字が無くなってしまうのでわかりにくくなっているだけに過ぎません。難しいところですが、文脈によって把握するしかありませんが、元になった英語の文章を読むと理解しやすいかも知れません。

投稿2016/08/06 21:05

raccy

総合スコア21737

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

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

k_mail

2016/08/07 11:43

ご返信が遅くなり申し訳ございません。 現時点では、理解できなかったですけど、 長文で回答いただきありがとうございます。 また、振り返って読み返してみたいと思います。 ありがとうございます。
guest

0

こんにちは。

まず、オブジェクトと言う用語は文脈によって意味が代りますので、あまり厳密に捉えない方がよいです。
クラス型のことをオブジェクトと表現することもあれば、インスタンスのことをオブジェクトと表現することもあります。クラスもインスタンスもごたまぜにしたオブジェクト指向という概念でとらえた方がすっきりするかも知れません。

疑問点としては、変数Penはnew でインスタンス化したものを入れているのに、

なぜ、変数g にはnewをしたものを入れなくてはいいのかです。

このケースでは単に、PictureBox1.CreateGraphics()の内部でnewしたものを返却しているだけではないかと思います。

投稿2016/08/06 05:17

Chironian

総合スコア23272

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

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

k_mail

2016/08/07 11:38

>PictureBox1.CreateGraphics()の内部でnewしたものを返却している 絶対newがなければいけないと思っていました。 メソッドが内部でnewしたものを返却するという方法を知り、 大変勉強になりました。 ありがとうございます。
guest

0

ベストアンサー

ご質問の表題と内容に若干の飛躍があるように思います。内容の方に関しては他の方が説明されているように、メソッド(関数)の中でnewされていると考えれば簡単に疑問は解決すると思われます。
その上でこちらもチェックしておいていただきたいのですが、インスタンス化しなくても使えるクラス(型)自体に属するメンバ(変数、関数、フィールド、プロパティ、メソッド等々)も存在します。これはプログラムが開始されたときにプログラムのどこかに一カ所だけ最初から作られるものです。この場合、クラスをインスタンス化しなくてもそれらのメンバを使うことが可能です。言語によってやり方は違いますが、通常のメンバとは定義の方法が少し違うはずです。また、名称もクラス自体に属するのでクラスメンバといったり、最初から存在するので静的メンバといったりします。

さて、表題はもっと一般的な話になりますね。言葉の定義は文脈で全く違った意味になることもありますが、一般論の1つとして考えていただき、確認はご自身でお願いします。

インスタンスという言葉が我々の世界(情報工学界?)に広まったのはオブジェクト指向が知られるようになってからだと思います。それまでも、オブジェクトという言葉はありました。c言語のファイルをコンパイルすると拡張子 o のファイルができて、それをオブジェクトファイル、と言ったり。まぁ、単なる「物」ですから、なんにでも当てはめようと思えば当てはめられてしまいますが。
インスタンスというのはオブジェクト指向の用語で、クラスを実体化したオブジェクトのことをいいます。なので、インスタンスはオブジェクトですが、オブジェクトはインスタンスであるとは限らず、イコールではありません。

たとえば、上記のクラスメンバ(クラスをインスタンス化しなくても使えるメンバ)はプログラムがロードされ、意図したプログラムが動き出す前に既に存在する状態になります。つまり、インスタンス化しないオブジェクトということができます。

このような答えでご納得されましたか?

投稿2016/08/19 12:54

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

k_mail

2016/08/19 13:17

質問のタイトルと内容が合っていませんでしたね。 ご指摘ありがとうございました。
退会済みユーザー

退会済みユーザー

2016/08/19 21:58

それは気にしなくてもいいと思います。 今後も臆せずに質問していけばいいと思います。
guest

0

クラスをインスタンス化したものがオブジェクトだそうです。
なので、

Dim pen as new Pen(Color.Black)

Penクラスのインスタンスをnew命令で作成して、出来上がったオブジェクトをpenに代入している。
みたいに捉えると良いのではないでしょうか。

Dim g as Graphics = PictureBox1.CreateGraphics()

こちらの場合は、恐らくCreateGraphicsメソッドの中で、
Graphicsクラスをnewして返しているのだと思います。
恐らくというのは、もしかしたら更に別のメソッドを呼んで作っている可能性もあるから。

でもインスタンスとオブジェクトは、ほとんど同じ意味で使うことが多いように思います。

投稿2016/08/06 11:43

Mr_Roboto

総合スコア2208

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

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

k_mail

2016/08/07 11:35

>CreateGraphicsメソッドの中で、 >Graphicsクラスをnewして返している こんなことができるとは知りませんでした。 ありがとうございます。
guest

0

インスタンス化して初めて描画のためのオブジェクトが作成されるのではないか?

その通りです。この一文をみるとすでにご自身で理解されてるように見えます。

質問への回答ではないのですが、皆さんと違った観点から話をすると、
一人で小さいプログラムを書いているとメリットがわかりにくいと思います。
Penのインスタンスを生成するのに、その場でnewをしていますが、あとからPenの種類が増える(Penを継承したサブクラスを用意する)のであれば、メソッドの中でnewをして(インスタンス化して)戻り値としてオブジェクトを返すようにするほうが変更箇所が少なくて済む(可能性が高い)です。

細かいことをいうとデザインパターンというものがあって、メソッドの戻りでオブジェクトを返すことはfactoryに分類されます。

投稿2016/08/06 21:06

nullbot

総合スコア910

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

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

k_mail

2016/08/07 11:33

>細かいことをいうとデザインパターンというものがあって、メソッドの戻りでオブジェク>トを返すことはfactoryに分類されます。 細かいことだなんて。。 非常に勉強になります。 ありがとうございました。
guest

0

PictureBox1.CreateGraphics()ってCreateGraphicsメソッド内部でインスタンスを作って返しているか、静的なインスタンスを返しているかの何方かだと思います。

「オブジェクトは型」と書かれていたのは、Object型(若しくはobject型)のある言語の話だと思います。インスタンスとオブジェクトは同じものです。(前出のオブジェクト型は別の話)

投稿2016/08/06 15:39

administrator

総合スコア20

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

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

0

疑問点としては、変数Penはnew でインスタンス化したものを入れているのに、

なぜ、変数g にはnewをしたものを入れなくてはいいのかです。

大雑把に言うと、オブジェクト指向はデータに仕事をさせます。
当然、どのデータに仕事をさせるかを意識しなければいけません。


VB.NET

1Dim g as Graphics = PictureBox1.CreateGraphics()

PictureBox1へのグラフィックス処理を行うためのグラフィックオブジェクト

に対していろいろ操作をこの後したいわけですから、
どこかにある、「PictureBox1へのグラフィックス処理を行うためのグラフィックオブジェクト」を取ってこなければなりません。


VB.NET

1Dim pen as new Pen(Color.Black)

別に黒色のPenクラスのインスタンスならなんでもいいので新しく作ってます。

投稿2016/08/06 06:01

ozwk

総合スコア13551

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問