Revised: Feb./23rd/2003: Since: Dec./26th/2001
クラスからオブジェクトを作ることをインスタンス化と呼び、オブジェクト固有のメモリ上のデータをインスタンスと呼びます。
例えば、クラスでメンバー変数 x が宣言されているとき、コンストラクタの呼び出しによって、メモリ上に、新たに生成されるオブジェクト用の x の領域が確保されます。これがインスタンス化であり、オブジェクト固有の x がインスタンスです。
クラスをインスタンス化してオブジェクトを作成するには、次のように記述します:
// オブジェクトを参照する変数宣言 クラス名 変数名; //インスタンス化 変数名 = new クラス名();
または次のようにも記述できます:
//インスタンス化 クラス名 変数名 = new クラス名();
通常の変数の定義と同じことに注目してください。まず、指定したクラス型の変数を定義しています。そして、この変数に、インスタンス化したオブジェクトへの参照が代入されます。この参照を通して、オブジェクトは操作されます。
クラス名()
がコンストラクタと呼ばれるものであり、コンストラクタを実行することで、クラスはインスタンス化されます。コンストラクタは、オブジェクトをコンストラクトするんですね。そして、オブジェクト用にコンストラクトされたメモリ上のデータをインスタンスと呼ぶのです。
このようにして作ったオブジェクトのメソッドを利用するには次のようにします:
変数名.メソッド名();
メンバ変数の利用も同様です:
変数名.メンバ変数名;
ここで、クラス型で宣言された変数には、オブジェクトそのものが代入されているわけではなく、オブジェクトのインスタンスを参照するIDが代入されています。従って、同じオブジェクトへの参照を複数の変数に代入することが可能です。
オブジェクトの参照を代入する変数は、具体的なリテラルが代入されている基本データ型の変数と区別して、参照型変数と呼ばれます。参照型変数のデータ型は、オブジェクトが生成されたクラス型になります。例えば、String クラスから生成されたオブジェクトは String 型変数に代入可能であり、Date クラスから生成されたオブジェクトは Data 型変数に代入可能です。
オブジェクトは、その「参照」と呼ばれるものが代入された変数を介してしか、利用することができません。このため、オブジェクトへの参照が代入された変数そのものをオブジェクトと呼んでしまうことがあります。
Java の実行環境には、便利なクラスがたくさん用意されています。これらは標準クラス・ライブラリと呼ばれ、コア・パッケージというものに格納して配布されています。標準クラス・ライブラリの中のクラスのひとつをインスタンス化して、そのメソッドを利用してみましょう:
TestClass.java
:
class TestClass { public static void main(String[] args) { //インスタンス化 StringBuffer mojiretsu = new StringBuffer("Hello"); //メソッドの利用 mojiretsu.reverse(); System.out.print(mojiretsu); } }
クラスライブラリ StringBuffer
クラスをインスタンス化しています。このクラスは、可変の文字列を格納します。
ここで定義したオブジェクトの参照変数は mojiretsu
であり、コンストラクタ呼び出し時に文字列 "Hello"
を送っています。
さて、オブジェクト mojiretsu
のメソッドとして、 reverse()
が現れています。このメソッドは StringBuffer
型のインスタンスに格納された文字列を逆の並び順の文字列に置換します。
C:\Java>javac TestClass.java C:\Java>java TestClass olleH
予想どおり、 StringBuffer
クラス型の変数 mojiretsu
に格納した文字列が逆の並び順に置換されています。
ここではクラスのインスタンス化とメソッドの利用について紹介しました。
オブジェクトはクラスをインスタンス化してつくられます。インスタンスはオブジェクトの実体で、メモリ上に保持された具体的な値から成っています。メモリ領域を占有している実体は、クラスとインスタンスしかありません。
しかし、開発している側から見ると、操作対象としてのオブジェクトが存在するように見えるのです。オブジェクトの実体は、クラスとインスタンスです。オブジェクトにメッセージを送ると、実際はクラスのメソッドに制御が移り、メモリ上のインスタンスを書き換えて、制御が戻ってきます。値とメソッドを持ったオブジェクトが存在しているように考えることが出来ます。そして、開発中は、そのように考えた方が分かりやすくなります。
本稿ではインスタンスとオブジェクトは区別しません。オブジェクトと言っている場合でも、殆どの場合はインスタンスのことです。また、オブジェクトへの参照が代入された変数名でオブジェクトを呼びます。
オブジェクト指向は "object oriented" の訳語です。 "instance" も "object" も一般用語です。日本に輸入されてカタカナ語のまま使われることで、専門用語のように働いているのが皮肉ですが、そもそもの着想は、専門性を排して日常的な発想に近づけることです。英語が得意な方は、日常的な単語として object, instance などの意味を把握されるのが良いでしょう。