※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

4. 型と値と変数

4.1. 型と変数の種類

4.2. プリミティブ型と値

4.3. 参照型と値

4.3.1. オブジェクト

オブジェクト(object)クラスインスタンス(class instance)または配列です。

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

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

配列は配列作成式で明示的に作成されます。

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

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

BooleanByteShortCharacterIntegerLongFloatDouble型の新たなオブジェクトはボックス化変換が行われる時に暗黙的に作成されます。

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

このプログラムは以下を出力します。:

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

オブジェクトの参照に対する演算子は以下の通りです。:

同一オブジェクトに対し参照は複数存在して構いません。大抵のオブジェクトはステートを持ち、クラスのインスタンスであるオブジェクトのフィールドに保存されたり、配列オブジェクトの構成要素である変数に保存されたりします。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);
    }
}

このプログラムは以下を出力します。:

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

v1.valv2.valはただ1つのnew式で作成された1つのValueオブジェクト内にある同じインスタンス変数を参照しています。一方i1i2は異なる変数です。

個々のオブジェクトはモニターと関連付けられています。モニターはsynchronizedメソッドsynchronized文で使用され複数のスレッドがステートへ行う平行アクセスを制御するのに用いられます。

4.3.2. Objectクラス

4.3.3. Stringクラス

4.3.4. 参照型が同じである条件

4.4. 型変数

4.5. 引数付き型

4.6. 型の抹消

4.7. 具象可能型

4.8. 未加工型

4.9. 交差型

4.10. サブタイプ化

4.11. 型の使用箇所

4.12. 変数