参照型

プログラミングの変数に対する値の受け渡しに「値引渡し」と「参照引き渡し」があります。
これは、C言語の説明で利用されているプログラミング用語です。Javaにもその概念で説明できます。
C言語では、「参照引き渡し」を「ポインター」という方法で実行しています。
C言語のポインターは、プログラム中級者まで習熟しないと理解し難い内容でした。

Javaにおける「値引渡し」は前頁までに説明させて頂いた基本データ型である型名 変数名 = 値;を示します。
Javaにおける「参照引き渡し」は、基本データ型(配列を除く)以外全てのデータ構造(配列、オブジェクト全て)を示します。
本頁では、その「参照引き渡し」一般的に参照型と呼ばれる内容について説明します。

参照型とインスタンスの生成

参照型の画像
上記図のJavaサンプルコード

    private void Hoge(){
        //1.
        ObjectX x;
        //2、3、4
        x = new ObjectX();

        //5.
        ObjectY y;
        //6、7
        y = x;
    }
						

上記図とソースのサンプルから順に説明します。

  1. ObjectX xを変数に定義し、初期値nullがxに設定されます。
  2. new ObjectXにより、JVM内にObjectXのメモリ領域が確保されます。
    このとき、JVM上の確保した領域に生成したインスタンスを特定するアドレス情報を生成します。
    住所や電話番号のように一意の番号で何かを特定するための情報です。
  3. ObjectX x = new ObjectXにより、xに生成されたアドレス情報が設定されます。
  4. オブジェクト変数xにアドレス情報を設定したことにより、xと2.で生成されたオブジェクトの参照が可能となります。
  5. ObjectY yを変数に定義し、初期値nullがyに設定されます。
  6. y = x により、xのアドレス情報をyにコピーされます。
  7. yは、2.のインスタンスをアドレス情報から参照します。

要点1上記図のようにインスタンスはJVM上1つしか確保していません。

要点2x,yそれぞれ同じインスタンスを参照しているので、
x.メソッド(値);で2.のインスタンスのデータを変更すると、変更後にyの変数で2.のインスタンスにアクセスした場合にも
データは変更されたように参照されます。これは、生成された実体(インスタンス)が1つだからです。

このように、プリミティブ型(配列)を除く全てのオブジェクトは、参照型になります。

xとyを分けて管理する方法は、それぞれインスタンスをnewで生成することです。

xのインスタンスをコピーして新しいインスタンスを複製する方法は、別章にて説明します。

プリミティブ型の配列の複製は、前頁に記載したArrays.copy系メソッドで実現できます。