////////////////////////////////////////////////////////////////////////////////
// << j232b.java >>
//
// クラス(3):引数(文字列 値渡し・参照渡し)
//
// 「参照渡し」の結果、メソッド内で仮引数に変更がなされると、
// 実引数にその影響が及ぶ。
//
// ●Stringクラス
// ・Stringクラスで作成された文字列は変更できない。
// ・値渡しが行われる。
//
// ●StringBufferクラス
// ・このクラスで作成された文字列は、文字列中の文字を変更(追加、削除、置換など)
// できる。
// ・参照渡しが行われる。
//
// (1)オブジェクトの作成。
// (2)実引数(Stringクラスの文字列変数)sにabcを代入。
// (3)メソッドm1の呼び出し。
// (4)仮引数tを変更。
// (5)実引数(StringBufferクラスの文字列変数)sbにabcを代入。
// (6)メソッドm2の呼び出し。
// (7)仮引数tbを変更。
//
////////////////////////////////////////////////////////////////////////////////
class C {
void m1(String t) {
System.out.println("メソッド開始直後:t = " + t);
t = "( " + t + " )"; //(4)
System.out.println("メソッド終了直前:t = " + t);
}
void m2(StringBuffer tb) {
System.out.println("メソッド開始直後:tb = " + tb);
tb.reverse(); //(7)
System.out.println("メソッド終了直前:tb = " + tb);
}
}
class j232b {
public static void main(String args[]) {
C obj = new C(); //(1)
String s = new String("abc"); //(2)
System.out.println("値渡し実行前:s = " + s);
obj.m1(s); //(3)
System.out.println("値渡し実行後:s = " + s);
System.out.println();
StringBuffer sb = new StringBuffer("abc"); //(5)
System.out.println("参照渡し実行前:sb = " + sb);
obj.m2(sb); //(6)
System.out.println("参照渡し実行後:sb = " + sb);
}
}
実行結果
% javac j232b.java
% java j232b
値渡し実行前:s = abc
メソッド開始直後:t = abc
メソッド終了直前:t = ( abc )
値渡し実行後:s = abc
参照渡し実行前:sb = abc
メソッド開始直後:tb = abc
メソッド終了直前:tb = cba
参照渡し実行後:sb = cba