////////////////////////////////////////////////////////////////////////////////
//  << 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