連載
» 2008年01月28日 00時00分 公開

ソースコードで学ぶ SJC-P 5.0 ドリル(3):thisキーワードを使いこなす (1/2)

本連載は、サン・マイクロシステムズ認定のJava資格Sun Certified Programmer for Java 2 Platform 5.0(SJC-P5.0)に対応しています。最新の出題傾向に基づいて、ソースコードの問題を中心に毎回模擬問題を1問出題します。ソースコードに慣れながら、SJC-P合格を目指して頑張りましょう。

[山本道子,有限会社 Ray]

 連載第3回の今回は、メソッド、変数、コンストラクタで使用するthisキーワードに関する出題です。

thisとは

 thisとは自分自身(自オブジェクト)を明示的に表現する際に使用します。thisは、変数、メソッド、コンストラクタで使用することができます。まず変数に使用する場合を見てみましょう。

変数でthisを使用する

 次のサンプルコード1では、setVal()メソッドの引数で受け取った値をインスタンス変数に代入するという処理を行っています。

 1. class Sample {
 2.   int val;
 3.   void setVal(int a) {
 4.     val = a;
 5.   }
 6. }
サンプルコード1

 上のサンプルコード1では、引数で指定しているローカル変数名はa、インスタンス変数で指定している変数名はvalです。それぞれ名前が異なるため、ローカル変数aの値は、インスタンス変数valに問題なく代入されます(図1)。

図1 引数で指定した名前と、インスタンス変数の名前が違う場合 図1 引数で指定した名前と、インスタンス変数の名前が違う場合

 しかし、ローカル変数とインスタンス変数を同じ名前にして、同じように変数の値を代入しようとしても、予想する結果を得ることができません。

図2 引数で指定した名前と、インスタンス変数の名前が同じ場合 図2 引数で指定した名前と、インスタンス変数の名前が同じ場合

 これはローカル変数とインスタンス変数に同じ名前を使用する際、インスタンス変数を示すときにthisを使用することで解決できます。

図3 同じ変数名でも、インスタンス変数にthisキーワードを使用した場合 図3 同じ変数名でも、インスタンス変数にthisキーワードを使用した場合

コンストラクタで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.

コンパイルエラー

       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。