>>878
C と同じように関数の引数は値渡しなので、
引数の値を変えても、呼び出し元には影響を与えない。
(ここでは、Foo のインスタンスへの参照が、値渡しされている)

こんな感じでどうだ

static void swap(Foo[] foo, int n, int m) {
 Foo tmp;
 tmp = foo[n]; foo[n] = foo[m]; foo[m] = tmp;
}