akios @ ウィキ
4.3.1. オブジェクト
最終更新:
akios
-
view
4. 型と値と変数
4.1. 型と変数の種類
4.2. プリミティブ型と値
4.3. 参照型と値
4.3.1. オブジェクト
オブジェクト(object)はクラスインスタンス(class instance)または配列です。
参照値(単に参照(reference))はオブジェクトへのポインターです。どのオブジェクトも参照しない特別なヌル参照もあります。
クラスインスタンスはクラスインスタンス作成式で明示的に作成されます。
配列は配列作成式で明示的に作成されます。
配列初期化式が評価された時に新たな配列オブジェクトが暗黙的に作成されます。これはクラスやインタフェースが初期化される場合や、クラスの新たなインスタンスが作成される場合、局所変数宣言文が実行される場合にあたります。
BooleanやByte、Short、Character、Integer、Long、Float、Double型の新たなオブジェクトはボックス化変換が行われる時に暗黙的に作成されます。
class Point { int x, y; Point() { System.out.println("default"); } Point(int x, int y) { this.x = x; this.y = y; } /* A Point instance is explicitly created at class initialization time: */ static Point origin = new Point(0,0); /* A String can be implicitly created by a + operator: */ public String toString() { return "(" + x + "," + y + ")"; } } class Test { public static void main(String[] args) { /* A Point is explicitly created using newInstance: */ Point p = null; try { p = (Point)Class.forName("Point").newInstance(); } catch (Exception e) { System.out.println(e); } /* An array is implicitly created by an array constructor: */ Point a[] = { new Point(0,0), new Point(1,1) }; /* Strings are implicitly created by + operators: */ System.out.println("p: " + p); System.out.println("a: { " + a[0] + ", " + a[1] + " }"); /* An array is explicitly created by an array creation expression: */ String sa[] = new String[2]; sa[0] = "he"; sa[1] = "llo"; System.out.println(sa[0] + sa[1]); } }
このプログラムは以下を出力します。:
default p: (0,0) a: { (0,0), (1,1) } hello
オブジェクトの参照に対する演算子は以下の通りです。:
- フィールドアクセス、限定名またはフィールドアクセス式
- メソッド呼び出し
- キャスト演算子(5.5.、15.16.)
- 文字列結合演算子+、Stringオペランドと参照を与えると参照するオブジェクトのtoStringメソッドを呼び出すことによりString表現に参照を変換し(参照もしくはtoStringの結果のいずれかがヌル参照ならば"null"が使用されます)2つの文字列を結合して新たなString型を作成します
- instanceof演算子
- 参照等価演算子==と!=
- 条件演算子? :
同一オブジェクトに対し参照は複数存在して構いません。大抵のオブジェクトはステートを持ち、クラスのインスタンスであるオブジェクトのフィールドに保存されたり、配列オブジェクトの構成要素である変数に保存されたりします。2つの変数が同じオブジェクトへの参照を持っているなら、オブジェクトを参照する一方の変数からオブジェクトのステートを変更すると、他方の変数からその変更されたステートを観察することができます。
class Value { int val; } class Test { public static void main(String[] args) { int i1 = 3; int i2 = i1; i2 = 4; System.out.print("i1==" + i1); System.out.println(" but i2==" + i2); Value v1 = new Value(); v1.val = 5; Value v2 = v1; v2.val = 6; System.out.print("v1.val==" + v1.val); System.out.println(" and v2.val==" + v2.val); } }
このプログラムは以下を出力します。:
i1==3 but i2==4 v1.val==6 and v2.val==6
v1.valとv2.valはただ1つのnew式で作成された1つのValueオブジェクト内にある同じインスタンス変数を参照しています。一方i1とi2は異なる変数です。
個々のオブジェクトはモニターと関連付けられています。モニターはsynchronizedメソッドやsynchronized文で使用され複数のスレッドがステートへ行う平行アクセスを制御するのに用いられます。