java silverの資格の勉強をしている者です。
参考書の問題に以下がありました。
public class Test{ public static void main (String[] args) { Test ojb1 = new Test(); Test ojb2 = new Test(); System.out.print(ojb1 == ojb2); ojb2 = operate(ojb1, ojb2); System.out.print(" " + (ojb1 == ojb2)); } static Test operate(Test ojb1, Test ojb2) { Test ojb3 = ojb1; ojb1 = ojb2; return ojb3; } }
コンパイル、実行した結果として正しいものは次のどれですか。1つ選択してください。
A, false false
B, true true
C, false true
D, true false
E, コンパイルエラー
私のイメージだと正解は「A, false false」になると思っていましたが、正解は「C, false true」でした。
operateメソッド内で引数ojb1に対して代入されていますが、参照型のためこの代入はmainメソッド内のojb1に対しても有効だと考えていました。しかし、実際にローカル環境でobj変数を確認してみてもmainメソッド内とoperateメソッド内では別物として扱われているようです。なぜこのような結果になるのでしょうか。
ご回答いただけると幸いです。よろしくお願いいたします。
以下のような場合は、参照型の引数が直接書き換わるのですが、上の場合と違いがわかりません。
class Test2 {
static void x(StringBuilder sb) {
sb.append("hoge");
}
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("sb test");
System.out.println(sb);
x(sb);
System.out.print(sb);
}
}