【Java入門】オブジェクトとインスタンスの違いをわかりやすく解説
Javaを学び始めると必ず出てくるキーワードが 「オブジェクト」 と 「インスタンス」 です。
どちらも似た意味で使われることが多く、違いがよく分からない…という声をよく耳にします。
本記事では、両者の違いを整理しつつ、イメージしやすい例を紹介します。
1. クラス・オブジェクト・インスタンスの関係
まず大前提として、Javaのプログラミングに登場する概念を整理しましょう。
-
クラス (Class)
設計図。どんなデータや処理を持つかを定義するもの。 -
オブジェクト (Object)
「モノ」という抽象的な存在を指す概念。
クラスから生成される実体を総称して「オブジェクト」と呼ぶ。 -
インスタンス (Instance)
具体的にメモリ上に確保された1つの実体。
「オブジェクトがプログラム上で実際に存在している状態」を指す。
2. 実際のコードでイメージする
例えば、犬を表すクラスを作ってみます。
1 2 3 4 5 6 |
class Dog { String name; void bark() { System.out.println(name + " がワンワン吠えています!"); } } |
この Dog
クラスは「設計図」です。
ここから具体的な犬を作るとどうなるでしょうか?
1 2 3 4 5 6 7 8 9 10 11 |
public class Main { public static void main(String[] args) { Dog pochi = new Dog(); // インスタンス生成 pochi.name = "ポチ"; pochi.bark(); Dog kuro = new Dog(); // 別のインスタンス kuro.name = "クロ"; kuro.bark(); } } |
出力結果:
ポチ がワンワン吠えています! クロ がワンワン吠えています! |
-
pochi
という インスタンス(具体的な犬)ができる -
kuro
という インスタンスも別に存在する -
それぞれをまとめて「Dogクラスのオブジェクト」と呼ぶことができる
つまり、オブジェクトは概念的な呼び方、インスタンスはその実体を強調する呼び方という違いがあります。
3. よくある混乱ポイント
-
「オブジェクト」と「インスタンス」は日常会話ではほぼ同じ意味で使われることが多い
-
教科書やAPIリファレンスでは「インスタンス化」「オブジェクト参照」といった形で区別される
-
特に試験や設計書では「インスタンス=newで生成された具体物」と覚えておくと混乱しにくい
4. まとめ
-
クラス = 設計図
-
オブジェクト = クラスから作られる「モノ」という概念
-
インスタンス = 実際に生成されメモリ上に存在する「具体的な実体」
プログラミングにおいては「オブジェクト」と「インスタンス」を厳密に区別しないケースも多いですが、
概念を押さえておくと理解がぐっと深まります。
オブジェクトが俗語ですか…。
Smalltalkでは、メッセージを受け取ることが出来るものを指してオブジェクトとといいます。インスタンスもクラスも変数に突っ込んでしまえばメッセージを送る側からすれば区別がつきません。故に基本的にインスタンスにメッセージを送るなどと言わずオブジェクトにメッセージを送ると言います。
| object |
“クラスオブジェクトにメッセージを送る。
object := Example.
object doSomething.
“インスタンスオブジェクトにメッセージを送る”
object := Example new.
object doSomething.
インスタンスという言葉の使い方ですが同じクラスのインスタンスとクラスを明確に区別したい時に使ってます。Exampleクラスのオブジェクトでは、クラスオブジェクトを指してるのかインスタンスオブジェクトを指してるのか分かりませんから。
[…] トとインスタンスを同じような意味で書いてしまいましたが、厳密には異なります。以下の記事で詳しく説明されてます。インスタンスとオブジェクトの違いhttp://write-remember.com/archives/697/ […]