Bits of Java (トップ)

VM   JDK と JRE
Language   オブジェクトとインスタンス   this と super   static   フィールドアクセス
IO   Serializable の実装
Swing   MetalLookAndFeel   イメージパネル
JavaBeans   プロパティ名について   XMLEncoder で保存
その他   正規表現テストアプリ   秀丸の強調表示   Ant のインストール   文字セット変換 Ant タスク   XAMPP + Tomcat

オブジェクトとインスタンスの違い

このページは Java におけるオブジェクトとインスタンスという2つの表現の違いに関する内容です。

Java では new や Class#newInstance などでクラスを具現化することにより、具現化のひな型となったクラスで宣言あるいは継承している状態と振る舞いを持つものがプログラム上の存在として生成されます。 このクラスを具現化してプログラム上に生成されたものをオブジェクトと呼びます。 オブジェクトがもつ状態とは実際にはひな型となったクラスと Object クラスまでたどったすべてのスーパークラスに宣言されているインスタンス変数の値です。 オブジェクトがもつ振る舞いの方はメソッドの実行による動作を指します。 同じクラスを具現化したオブジェクトでもそれぞれが独自の状態を保持できる為に振る舞いも違ってきます。 具体的にはオブジェクトごとのインスタンス変数の値が違っている場合にそれらのインスタンス変数にアクセスしているメソッドを実行すると動作や戻り値も違ってくる、ということになります。

instance の方は辞書で意味を調べると "例、事例、実例" とあり instantiate は "抽象的なことを具体例で示す" とあります。 つまり "クラスを具現化したもの" という意味でインスタンスという言葉が使われているのではないでしょうか。 前出のようにクラスを具現化したものはオブジェクトですからインスタンスはオブジェクトを指して使う言葉という事になります。

しかしまるっきり同じ意味というわけではありません。 Java言語規定 第3版 4.12.6 (日本語訳) に以下のような記述があります。

Every object belongs to some particular class: the class that was mentioned in the creation expression that produced the object, the class whose Class object was used to invoke a reflective method to produce the object, or the String class for objects implicitly created by the string concatenation operator + (§15.18.1). This class is called the class of the object. (Arrays also have a class, as described at the end of this section.) An object is said to be an instance of its class and of all superclasses of its class.

すべてのオブジェクトは,次に示すどれかのクラスに属する。つまり,そのオブジェクトを生成した生成式で言及したクラス,オブジェクトを生成するための自己反映的メソッドを呼び出すために Class オブジェクトが使用されたクラス,又は文字列連結演算子 + (15.18.1) によって暗黙に生成されたオブジェクト用の String クラス,のどれかに属する。このクラスを,そのオブジェクトのクラス(class of the object) と呼ぶ。(この節の最後で規定するとおり,配列もまたクラスを持つ。) オブジェクトは,そのクラス及びそのクラスのすべての上位クラスのインスタンスであるという。
よってインスタンスはオブジェクトを指してそのクラスやスーパークラスと共に使用される事が多いと思います。 例えばインスタンスの使用例として
    new Integer(10)
を指して以下のように表現できます。
Integer クラスのインスタンス
Object クラスのインスタンス
Number クラスのインスタンス
しかし
Serializable 型のインスタンス
Comparable インターフェイスのインスタンス
のようには表現できません。 Integer クラスのインスタンスは型としては Serializable, Comparable として扱えますが、これらはインターフェイスであり、インターフェイスは実装するもので具現化するものではないからです。 また Number クラスなどの抽象クラスは new などで直接インスタンスを生成できませんがサブクラスのインスタンスを生成することで具現化されていると見なせるのでしょうか(個人的には少し違和感を感じますが)。 API ドキュメントを検索したところ
an instance of Number
という表現が javax.swing.text.NumberFormatter にあり、実際に抽象クラスを対象としてもインスタンスという言葉が使われています。

オブジェクトの方は インスタンスと違って インターフェイスを含めたすべての型による表現が可能になります。

Integer オブジェクト
Number 型オブジェクト
Object クラスのオブジェクト
Serializable 型のオブジェクト
Comparable オブジェクト
オブジェクトが備えている型とは、そのオブジェクトのクラスやすべてのスーパークラス、また実装しているすべてのインターフェイスでそれらは instanceof 演算子が true を返す型です。 ( instanceof 演算子がインターフェイスを対象として true を返してもそのインターフェイスのインスタンスとは呼ばないというのは instanceof という名前に矛盾しているような気がしますが...)

オブジェクトとインスタンスの使い分けですが、 API ドキュメントではメソッドの引数や戻り値の型を表現する場合に

an Integer instance
an Integer object
のようにインスタンスとオブジェクトの両方のパターンが使われていました。 どちらを使うかはコメントを書いたクラス作成者の好みのようですが、 インスタンスの方は引数や戻り値の型がインターフェイスの場合は使えませんので、どちらでも使用可能なオブジェクトの方が多く使われているようです。 JavaDoc のコメント以外の通常の Java に関する文章では "生成する" "生成された" などの意味を含めてオブジェクトを表現する場合に インスタンスが使われる事が多いと思います。 型として表現する場合にはオブジェクトの方を使っている場合が多いと思いますが、インスタンスもインターフェイスの型を表す場合を除いては同じように使われているようです。