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

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

[山本道子,有限会社 Ray]
前のページへ 1|2       

解答

 E

解説

 thisを使用したコンストラクタ呼び出しの問題です。この問題のサンプルコードでは、thisによるコンストラクタ呼び出しは各コンストラクタ定義の中で先頭に記述されているため、コンパイル・実行ともに問題ありません。

 まず、20行目ではTestクラスをインスタンス化しています。

20.     Test t = new Test();

 このとき、new Test()としていることから、引数なしのコンストラクタ(5行目)が呼び出されます。そして、6行目では、this()を使用してString型の値を引数に取るコンストラクタ(9行目)を呼び出しています。このとき、呼び出し先の処理(9行目以下)が完了するまで7行目は実行されないことに注意してください。

 5.   Test() {
 6.     this("A");
 7.     System.out.println("Test()");
 8.   }

 String型の引数を取るコンストラクタ(9行目)では、10行目でint型の値とString型の値を引数に取るコンストラクタ(13行目)を呼び出しています。ここでも呼び出し先の処理が完了するまで、11行目は実行されないことに注意してください。

 9.   Test(String str) {
10.     this(10, "B");
11.     System.out.println("Test(String str)");

 int型の値とString型の値を引数に取るコンストラクタ(13行目)では、引数で受け取った値をそれぞれインスタンス変数に代入しています。そして、16行目で「Test(int num, String str)」の出力をしています。

13.   Test(int num, String str) {
14.     this.num = num;
15.     this.str = str;
16.     System.out.println("Test(int num, String str)");
17.   }

 13〜17行目の処理が完了すると、このコンストラクタの呼び出し元(10行目)に制御が移ります。その結果、11行目の「Test(String str)」が出力されます。同じく9〜11行目の処理が完了したので、このコンストラクタの呼び出し元(6行目)に制御が移り、7行目の「Test()」が出力されます。これで20行目の処理がすべて終了します。

 そして、21行目では、num変数に直接アクセスしているため、「10」が出力されます。

21.     System.out.println(t.num);
【問題】
 次のプログラムをコンパイルし、実行するとどうなりますか? 
 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. コンパイルエラー

さらにもう一歩

 this()によるコンストラクタの呼び出しは、各コンストラクタ定義の中で先頭に記述する必要があります。例えば、以下のようなソースコードはコンパイルエラーとなります。

 1. class Bar {
 2.   int a; int b; int c;
 3.   public Bar() {
 4.     c = a + b;
 5.   }
 6.   public Bar(int a) {
 7.     this.a = a;
 8.     b = 100;
 9.     this();
10.   }
11. }
12. class Sample3 {
13.   public static void main(String[] args) {
14.     Bar bar = new Bar(200);
15.     System.out.println(bar.c);
16.   }
17. }
サンプルコード2
C:\Sample>
C:\Sample>javac Sample3.java
Sample3.java:9: this の呼び出しはコンス
トラクタの先頭文でなければなりません。 
    this();
        ^
エラー 1 個
C:\Sample>
サンプルコード2の実行結果 コンパイルエラー

 コンストラクタを複数宣言することで、さまざまなケースに対応した初期化処理を定義することができます。

 例えば、コンストラクタ内で複数のメンバ変数を初期化する場合、あるときはすべてのメンバ変数に値を渡したり、またあるときは一部のメンバ変数に対して値を渡すが、残りのメンバ変数に対してはデフォルト値で初期化したりということにも対応できます。さらに、各コンストラクタ内で共通の初期化処理があった場合、処理を定義したコンストラクタをthis()で呼び出すことでソースコードを簡潔にすることができます。

筆者紹介

山本道子

有限会社Ray代表。千葉県出身。一般事務、派遣を経て2000年サン・マイクロシステムズ入社。J2SEのほか、J2EEなどサーバサイドJavaコース担当およびテキスト開発に携わる。2004年退職後、有限会社Rayを設立し、システム開発、インストラクタ、執筆などを手掛けている。



前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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