IT転職・プログラミングスクール

ややこしいthis()を理解しよう【Java Silver例題】

Java Silver 例題

この記事は、Oracle Java SE8 Silver(1Z0-808)の対策講座です。

今回は、this()についてです。

初めて見たときはさっぱりわからなかったthis()。

今でもいまいちthis()を理解できずにいる方も多いかと思います。

Java Silverではthis()について高頻度で出題されます。

そのため、現場でも使いこなすためにしっかりとthis()を理解しましょう。

 

問題:this()について

早速ですが、次の3問を解いてみてください。

問1

次のプログラムを確認してください。

次のプログラムをコンパイル、実行したときの結果として正しいものを選びなさい。(1つ選択)

A. 「鳥動物とり」と出力される
B. 「動物鳥とり」と出力される
C. 「鳥とり」と出力される
D. 「鳥」と出力される
E. 「とり」と出力される
F.     コンパイルエラーになる

 

問2

次のプログラムを確認してください。

次のプログラムをコンパイル、実行したときの結果として正しいものを選びなさい。(1つ選択)

A. 「AbB」と表示される
B. 「BAb」と表示される
C. 「ABb」と表示される
D. 「Bb」と表示される
E. 「bB」と表示される
F. コンパイルエラーになる

 

問3

次のプログラムを確認してください。

次のプログラムをコンパイル、実行したときの結果として正しいものを選びなさい。(1つ選択)

A. 「PPCchildren」と表示される
B. 「PCchildren」と表示される
C. 「Pchildren」と表示される
D. 「Cchildren」と表示される
E.     コンパイルエラーになる

 

 

いかがでしょうか?

 

 

答えは
問1 B
問2 F
問3 E   
です。

 

Java Silver 問題集
参考記事【Java Silver問題集】高頻出・間違えやすい問題たち

この記事は、Oracle Java SE8 Silver(1Z0-808)の対策講座です。 出題確率が高く、間違いやすい例題が解説付きで100問以上あります。   Java Silver 問 ...

続きを見る

 

this()のポイントと解説

this()は同じクラス内のコンストラクタを呼び出す時に使います。

this()に引数を入れると、その引数の型を持つコンストラクタを呼び出すこともできます。

このようにthis()の意味はいたってシンプルなのですが、あまり知られていないややこしいルールがあります。

this()のポイントは、次の3つが挙げられます。

this()のポイント

●子クラスにthis()があると暗黙的なsuper()は実行されない

● super()とthis()の両方があるとコンパイルエラーになる

● this()は一番上にないとコンパイルエラーになる

1つずつ解説していきます。

 

子クラスにthis()があると暗黙的なsuper()は実行されない

this()は同じクラス内のコンストラクタを呼び出すのに対し、super()は親クラスのコンストラクタを呼び出します。

super()の特徴として、子クラスのコンストラクタに書かれていなくても暗黙的にまずsuper()が実行されます。

しかし、子コンストラクタ内にthis()が書かれていると暗黙的なsuper()は実行されません。

 

super()についてはこちらをご覧ください。

 

super()とthis()の両方があるとコンパイルエラーになる

子クラス内にsuper()とthis()の両方が書かれるとコンパイルエラーになります。

次のように引数も持ちのsuper()と引数なしのthis()だとしても、コンパイルエラーになります。

class Child extends Parent {
public Child(int a){               //コンパイルエラー
super(2);
this();
}
public Child(){
//処理文
}
}

 

this()は一番上にないとコンパイルエラーになる

this()はコンストラクタ内の一番上に書かないとコンパイルエラーになります。

class Child extends Parent {
public Child(int a){
System.out.print(a);
this();                         //コンパイルエラー
}
public Child(){
//処理文
}
}

 

解説

この2つのポイントをしっかりとおさえていれば、今回の3問はスッキリと答えることができます。

 

問1

次のプログラムを確認してください。

次のプログラムをコンパイル、実行したときの結果として正しいものを選びなさい。(1つ選択)

A. 「鳥動物とり」と出力される
B. 「動物鳥とり」と出力される
C. 「鳥とり」と出力される
D. 「鳥」と出力される
E. 「とり」と出力される
F.     コンパイルエラーになる

 

このプログラムでは、BirdクラスがAnimalクラスを継承し、MainクラスでBirdインスタンスを生成しています。

Birdインスタンスはint型の引数を持っているので、11行目のコンストラクタが呼び出されます。

このコンストラクタ内にはthis()があるため、次に8行目のコンストラクタが呼び出されます。

8行目のコンストラクタ内には、super()は書かれていませんが暗黙的にsuper()が実行されます。

そのため、次に2行目の親コンストラクタが呼び出されます。

整理すると以下の順でコンストラクタ内の処理が実行されます。

Animalコンストラクタ(2行目)
   ↓
Bird()コンストラクタ(8行目)
   ↓
Bird(int a)コンストラクタ(11行目)

したがって、「動物鳥とり」と出力されるため答えはBです。

 

問2

次のプログラムを確認してください。

次のプログラムをコンパイル、実行したときの結果として正しいものを選びなさい。(1つ選択)

A. 「AbB」と表示される
B. 「BAb」と表示される
C. 「ABb」と表示される
D. 「Bb」と表示される
E. 「bB」と表示される
F. コンパイルエラーになる

このプログラムでは、AクラスをBクラスが継承し、MainクラスでBインスタンスを生成しています。

Bインスタンスは引数はないので、8行目のコンストラクタが呼び出されます。

しかし、コンストラクタ内にthis()がありますが先頭にありません。

したがって、このプログラムはコンパイルエラーになるので答えはFです。

 

問3

次のプログラムを確認してください。

次のプログラムをコンパイル、実行したときの結果として正しいものを選びなさい。(1つ選択)

A. 「PPCchildren」と表示される
B. 「PCchildren」と表示される
C. 「Pchildren」と表示される
D. 「Cchildren」と表示される
E.     コンパイルエラーになる

このプログラムは、ParentクラスをChildクラスが継承し、MainクラスでChildインスタンスが生成されています。

Childインスタンスは引数を持っているので、11行目のコンストラクタが呼び出されます。

しかし、このコンストラクタ内にはsuper()とthis()が書かれています。

super()とthis()が両方存在する場合、コンパイルエラーとなるので答えはEです。

 

 

Java Silver 問題集
参考記事【Java Silver問題集】高頻出・間違えやすい問題たち

この記事は、Oracle Java SE8 Silver(1Z0-808)の対策講座です。 出題確率が高く、間違いやすい例題が解説付きで100問以上あります。   Java Silver 問 ...

続きを見る

-IT転職・プログラミングスクール
-,

Copyright© 人生2段飛ばし , 2020 All Rights Reserved Powered by AFFINGER5.