参照

参照 (Reference)

Javaの変数には 2 種類ある

Java の変数には、実体型と参照型の 2 種類があります。

実体型 (primitive)
int, double, char,...
参照型 (reference)
クラス (String, Vector,...), 配列
new 演算子により動的に生成される

「変数は箱である」の?

プログラミング言語の入門では、 「変数は箱である」という解説がされます。 そこをもう少し詳しく見てみましょう。

実体型の場合

int a = 10;

意味: a という名前の箱を用意し、その中に 10 という値を入れた。 箱の大きさは整数 int が入る大きさ。

参照型の場合

Vector v = new Vector();

意味: new Vector() で1つインスタンスを生成し、 それを v という名前で呼ぶことにした。 つまり、v という名前でインスタンスを参照することにした。

箱で考えるならば、 v という名前の箱を用意し、その中に、 どのインスタンスを v と呼ぶかという情報を入れたことになります。 インスタンスが入る箱ではないことに注意しましょう。 箱に入るのは特定のインスタンスを指し示す情報(参照)であり、 箱の大きさはインスタンスの種類によりません。

Vector v = new Vector();
Vector x = v;

x という箱に、v という箱の内容をコピーしています。 v という箱には、その名前でどのインスタンスを参照していたかという情報が入っているので、それがそのままコピーされると、x という名前でも同じインスタンスを参照するようになります。 つまり、1つのインスタンスに2つ呼び名がついた状態です。

インスタンスは1つのままで増えていないことに注意しましょう。 v.add("...") でも x.add("...") でも、 同じインスタンスに要素を追加することになります。

public static void main(String[] args) {
    Vector v = new Vector();
    foo(v);
}
private void foo(Vector x) {
    x.add("...");
}

メソッド foo の引数として v を与え、 それをメソッド側では x という変数で受けています。 これは x = v と同様、v が参照しているインスタンスを x も参照するようになったということです。 インスタンスがコピーされたわけではありません。