模擬問題に挑戦!
では、今回解説したことの理解度を確認するため、4問の模擬問題に挑戦してみましょう。
問題1
以下のコードを、コンパイル、実行した場合、正しい解答はどれですか?
■Sample4.java
class Foo {
int num;
}
public class Sample4 {
public static void main(String[] args) {
Foo obj = new Foo();
obj.num = 10;
bar(obj);
System.out.println(obj.num);
}
public static void bar(Foo obj) {
obj.num = 100;
}
}
- A. 「0」が出力される
- B. 「10」が出力される
- C. 「100」が出力される
- D. コンパイルエラーとなる
解答・解説
6行目でインスタンス化したFooオブジェクトに対し、7行目では「10」を格納しています。そして、8行目で、bar()メソッドの引数にこのオブジェクトを指定しています。参照型の変数を引数に指定しているので、参照情報のコピーとなります。つまり、main()メソッド側とbar()メソッド側では、同じFooクラスのオブジェクトを参照することになります。
12行目でnum変数に100を格納しているため、9行目では「100」が出力されます。
〔正解:C〕
問題2
以下のコードを、コンパイル、実行した場合、正しい解答はどれですか?
■Sample5.java
class Foo {
int num;
}
public class Sample5 {
public static void main(String[] args) {
Foo obj1 = new Foo();
Foo obj2 = obj1;
obj1.num = 100;
obj2.num = 200;
System.out.println(obj1.num);
}
}
- A. 「100」が出力される
- B. 「200」が出力される
- C. 「300」が出力される
- D. コンパイルエラーとなる
解答・解説
6行目では、Fooクラスのインスタンス化を行っていますが、7行目はobj2変数にobj1変数を代入しているので、インスタンス化は行われません。これも参照情報のコピーとなります。つまり、obj1変数とobj2変数は同じオブジェクトを参照しています。8行目でnum変数に「100」を代入していますが、9行目で「200」を代入することで、num変数が「200」に上書きされます。
〔正解:B〕

