わかりずらい Java の参照渡し (2/3)
String クラスの話の前に "オブジェクト参照" であることの説明を続けます。
先のサンプルAの String クラスを Vector クラスに変えたサンプルBを例とします。
サンプルB3の Vector#add(Object) メソッドは Vector に要素を追加するメソッドで、4で使用している Vector#size() メソッドは Vector に格納されている要素数を取得するメソッドです。
public class SampleB
{
public static void main(String[] args)
{
Vector v1 = new Vector(); ・・・1SampleB sampleB = new SampleB();
sampleB.test1(v1); ・・・2System.out.println(v1.size()); ・・・4
}public void test1(Vector v2)
{
v2.add("test1 メソッド実行"); ・・・3
}
}
このサンプルBを実行した時、4の部分でコンソールには
> java SampleB
1と出力されます。
1の段階ではオブジェクトが生成されたばかりで要素を持っていませんので、Vector#size() メソッドを実行しても出力は 0 です。
ところがサンプルAと違い、test1 メソッド内で操作した内容が main メソッドの変数:v1 のオブジェクトに反映されています。
これは、サンプルAでは変数:s2 を操作していたのに対し、サンプルBでは "オブジェクトの参照" で渡されたオブジェクトを操作しているからです。
もしサンプルBの test1 メソッドが、
public void test1(Vector v2)
{
v2 = new Vector();
v2.add("test1 メソッド実行");
}このような内容であれば、変数:v2 が操作されて参照するオブジェクトが変わっているので 4 での出力は 0 になります。
簡単に言ってしまえば、"=" で変数に代入しているか、オブジェクトのメソッドを使っているかの違いです。
引数は独立した変数ということを覚えておきましょう。
じゃぁサンプルAでも代入じゃなくてメソッドを使えば結果は変わるのか − いいえ。変わりません。
これは「String クラスにはオブジェクトそのものを操作するメソッドがない」というもう一つの落とし穴が存在するからです。
3/3 へ続く