「4.3.1. オブジェクト」の編集履歴(バックアップ)一覧に戻る

4.3.1. オブジェクト - (2012/09/07 (金) 21:21:31) のソース

*[[4. 型と値と変数]]
**[[4.1. 型と変数の種類]]
**[[4.2. プリミティブ型と値]]
**[[4.3. 参照型と値]]
***4.3.1. オブジェクト
&i(){オブジェクト(object)}は&i(){クラスインスタンス(class instance)}または&i(){配列}です。

参照値(単に&i(){参照(reference)})はオブジェクトへのポインターです。どのオブジェクトも参照しない特別なヌル参照もあります。

クラスインスタンスは[[クラスインスタンス作成式>15.9. クラスインスタンス作成式]]で明示的に作成されます。

配列は[[配列作成式>15.10. 配列作成式]]で明示的に作成されます。

[[文字列連結演算子+>15.18.1. 文字列連結演算子+]]を[[非定数式>15.28. 定数式]]の中で使用すると新たなクラスインスタンスが暗黙的に作成され、[[String型>4.3.3. Stringクラス]]の新たなオブジェクトとなります。

[[配列初期化>>10.6. 配列初期化子]]式が評価された時に新たな配列オブジェクトが暗黙的に作成されます。これは[[クラスやインタフェースが初期化される>12.4. クラスとインタフェースの初期化]]場合や、[[クラスの新たなインスタンスが作成される>15.9. クラスインスタンス作成式]]場合、[[局所変数宣言文>14.4. 局所変数宣言文]]が実行される場合にあたります。

&tt(){Boolean}や&tt(){Byte}、&tt(){Short}、&tt(){Character}、&tt(){Integer}、&tt(){Long}、&tt(){Float}、&tt(){Double}型の新たなオブジェクトは[[ボックス化変換>5.1.7. ボックス化変換]]が行われる時に暗黙的に作成されます。

#divstyle(background-color:#f0f0ff;border:1px solid black;padding 4px){{{

&bold(){&aname(ex4.3.1-1){例4.3.1-1. オブジェクト作成}}

 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]);
   }
 }

&i(){&small(){このプログラムは以下を出力します。:}}

 default
 p: (0,0)
 a: { (0,0), (1,1) }
 hello

}}}

オブジェクトの参照に対する演算子は以下の通りです。:
-フィールドアクセス、[[限定名>6.6. アクセス制御]]または[[フィールドアクセス式>15.11. フィールドアクセス式]]
-[[メソッド呼び出し>15.12. メソッド呼び出し式]]
-キャスト演算子([[5.5.>5.5. キャスト変換]]、[[15.16.>15.16. キャスト式]])
-[[文字列結合演算子+>15.18.1. 文字列結合演算子+]]、&tt(){String}オペランドと参照を与えると参照するオブジェクトの&tt(){toString}メソッドを呼び出すことにより&tt(){String}表現に参照を変換し(参照もしくは&tt(){toString}の結果のいずれかがヌル参照ならば&tt(){"null"}が使用されます)2つの文字列を結合して新たな&tt(){String}型を作成します
-[[instanceof演算子>15.20.2. 型比較演算子instanceof]]
-[[参照等価演算子==と!=>15.21.3. 参照等価演算子==と!=]]
-[[条件演算子? :>15.25. 条件演算子? :]]

同一オブジェクトに対し参照は複数存在して構いません。大抵のオブジェクトはステートを持ち、クラスのインスタンスであるオブジェクトのフィールドに保存されたり、配列オブジェクトの構成要素である変数に保存されたりします。2つの変数が同じオブジェクトへの参照を持っているなら、オブジェクトを参照する一方の変数からオブジェクトのステートを変更すると、他方の変数からその変更されたステートを観察することができます。

#divstyle(background-color:#f0f0ff;border:1px solid black;padding 4px){{{

&bold(){&aname(ex4.3.1-2){例4.3.1-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);
   }
 }

&i(){&small(){このプログラムは以下を出力します。:}}

 i1==3 but i2==4
 v1.val==6 and v2.val==6

&i(){&small(){&tt(){v1.val}と&tt(){v2.val}はただ1つの&tt(){new}式で作成された1つの&tt(){Value}オブジェクト内にある同じ[[インスタンス変数>4.12.3. 変数の種類]]を参照しています。一方&tt(){i1}と&tt(){i2}は異なる変数です。}}

}}}

個々のオブジェクトは[[モニター>17.1. 同期化]]と関連付けられています。モニターは[[synchronizedメソッド>8.4.3. メソッド修飾子]]や[[synchronized文>14.19. synchronized文]]で使用され複数の[[スレッド>17. スレッドとロック]]がステートへ行う平行アクセスを制御するのに用いられます。 

***[[4.3.2. Objectクラス]]
***[[4.3.3. Stringクラス]]
**[[4.4. 型変数]]
**[[4.5. 引数付き型]]
**[[4.6. 型の抹消]]
**[[4.7. 具象可能型]]
**[[4.8. 未加工型]]
**[[4.9. 交差型]]
**[[4.10. 型の派生]]
**[[4.11. 型の使用箇所]]
**[[4.12. 変数]]
目安箱バナー