Java の変数には、実体型と参照型の 2 種類があります。
プログラミング言語の入門では、 「変数は箱である」という解説がされます。 そこをもう少し詳しく見てみましょう。
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 も参照するようになったということです。 インスタンスがコピーされたわけではありません。