模擬問題に挑戦!(続き)
問題3
以下のコードを、コンパイル、実行した場合、正しい解答はどれですか?
■Sample6.javaimport java.util.ArrayList; class Foo { int num = 10; } public class Sample6 { public static void main(String[] args) { Foo obj = new Foo(); ArrayList<Foo> list = new ArrayList<Foo>(); list.add(obj); obj.num = 100; System.out.println(list.get(0).num); } }
- A. 「10」が出力される
- B. 「100」が出力される
- C. コンパイルエラーとなる
- D. 実行時エラーとなる
解答・解説
すこし迷いますね。これも参照情報のコピーを問う問題です。8行目でArrayList
オブジェクトを生成し、9行目でFoo
オブジェクトを格納していますが、これもArrayList
オブジェクト内には参照情報がコピーされています。したがって、10行目でFoo
オブジェクトのnum
変数に100
を代入していますが、11行目でArrayList
オブジェクト内で管理しているFoo
オブジェクトのnum
変数にアクセスすると「100
」が取得できます。
〔正解:B〕
問題4
以下のコードを、コンパイル、実行した場合、正しい解答はどれですか?
■Sample7.javapublic class Sample7 { static int num = 10; public static void main(String[] args) { method1(num); System.out.println("mainメソッド側:" + num); } public static void method1(int num) { num += 10; System.out.println("method1メソッド側:" + num); } }
-
A. 以下のように実行結果が表示される
method1メソッド側:20
mainメソッド側:10 -
B. 以下のように実行結果が表示される
method1メソッド側:20
mainメソッド側:20 - C. コンパイルエラーとなる
- D. 実行時エラーとなる
解答・解説
2行目でメンバ変数としてnum
変数を宣言しているので、クラス内全体で有効な変数です。したがって、4行目のmethod1()
メソッドの引数であるnum
は、2行目の変数を使用しています。しかし、method1()
メソッド内では7行目で引数としてnum
変数が宣言されています。したがって、8行目のnum
変数は、7行目の変数を使用するため、2行目のnum
変数に加算した結果の「20
」が代入されることはありません。
〔正解:A〕
あともう一言
問題4で使用した、Sample7
クラスの2行目にあるnum
変数は、static
変数です。もし、「int num =10;
」のように、インスタンス変数として宣言されているとどうなると思いますか?
答えは「コンパイルエラー」です。 理由は、staticなメソッドであるmain()
から、非staticであるインスタンス変数には、直接アクセスすることができないためです。
次回は、このstatic
修飾子について解説します。