プログラミングの変数に対する値の受け渡しに「値引渡し」と「参照引き渡し」があります。
これは、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;
}
上記図とソースのサンプルから順に説明します。
new ObjectX
により、JVM内にObjectXのメモリ領域が確保されます。ObjectX x = new ObjectX
により、xに生成されたアドレス情報が設定されます。y = x
により、xのアドレス情報をyにコピーされます。要点1上記図のようにインスタンスはJVM上1つしか確保していません。
要点2x,yそれぞれ同じインスタンスを参照しているので、
x.メソッド(値);
で2.のインスタンスのデータを変更すると、変更後にyの変数で2.のインスタンスにアクセスした場合にも
データは変更されたように参照されます。これは、生成された実体(インスタンス)が1つだからです。
このように、プリミティブ型(配列)を除く全てのオブジェクトは、参照型になります。
xとyを分けて管理する方法は、それぞれインスタンスをnew
で生成することです。
xのインスタンスをコピーして新しいインスタンスを複製する方法は、別章にて説明します。
プリミティブ型の配列の複製は、前頁に記載したArrays.copy系メソッドで実現できます。