本連載は、サン・マイクロシステムズ認定のJava資格Sun Certified Programmer for Java 2 Platform 5.0(SJC-P5.0)に対応しています。最新の出題傾向に基づいて、ソースコードの問題を中心に毎回模擬問題を1問出題します。ソースコードに慣れながら、SJC-P合格を目指して頑張りましょう。
連載第3回の今回は、メソッド、変数、コンストラクタで使用するthisキーワードに関する出題です。
thisとは自分自身(自オブジェクト)を明示的に表現する際に使用します。thisは、変数、メソッド、コンストラクタで使用することができます。まず変数に使用する場合を見てみましょう。
次のサンプルコード1では、setVal()メソッドの引数で受け取った値をインスタンス変数に代入するという処理を行っています。
1. class Sample { 2. int val; 3. void setVal(int a) { 4. val = a; 5. } 6. }
上のサンプルコード1では、引数で指定しているローカル変数名はa、インスタンス変数で指定している変数名はvalです。それぞれ名前が異なるため、ローカル変数aの値は、インスタンス変数valに問題なく代入されます(図1)。
しかし、ローカル変数とインスタンス変数を同じ名前にして、同じように変数の値を代入しようとしても、予想する結果を得ることができません。
これはローカル変数とインスタンス変数に同じ名前を使用する際、インスタンス変数を示すときにthisを使用することで解決できます。
newキーワードを使用してクラスをインスタンス化するとき、コンストラクタが呼び出されますが、呼び出されたコンストラクタの中で、自オブジェクト内に定義した別のコンストラクタを呼び出すことができます。その際、this()を使用します。しかし、this()の記述をする場合は、コンストラクタ定義の中で先頭に指定する必要があります。
以下の問題を考えてみてください。解答と解説は次のページにあります。
問題
次のプログラムをコンパイルし、実行するとどうなりますか? 1つ選択してください。
1. class Test { 2. int num; 3. String str; 4. 5. Test() { 6. this("A"); 7. System.out.println("Test()"); 8. } 9. Test(String str) { 10. this(10, "B"); 11. System.out.println("Test(String str)"); 12. } 13. Test(int num, String str) { 14. this.num = num; 15. this.str = str; 16. System.out.println("Test(int num, String str)"); 17. } 18. 19. public static void main(String[] args) { 20. Test t = new Test(); 21. System.out.println(t.num); 22. } 23. }
A.
0
Test()
Test(String str)
Test(int num, String str)
B.
10
Test()
Test(String str)
Test(int num, String str)
C.
10
Test(int num, String str)
Test(String str)
Test()
D.
Test()
Test(String str)
Test(int num, String str)
10
E.
Test(int num, String str)
Test(String str)
Test()
10
F.
コンパイルエラー
Copyright © ITmedia, Inc. All Rights Reserved.