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

コンストラクタを使いこなせ!【Java Silver例題】

Java Silver 例題

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

今回は、コンストラクについてです。

わかるようでわかりにくいコンストラクタ

Java Silverでは必ず出題され開発現場でもよく使われます。

そのため、コンストラクタをしっかりと理解しておく必要があります。

 

問題:コンストラクタについて

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

問1

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

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

A. 「ペンギン」と出力される
B. 「ペンギン鳥動物」と出力される
C. 「動物ペンギン」と出力される
D. 「動物鳥ペンギン」と出力される
E.     何も表示されない
F.     コンパイルエラーになる

 

問2

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

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

A. 「B」と表示される
B. 「AB」と表示される
C. 「b」と表示される
D. 「bA」と表示される
E. 「Ab」と表示される
F. コンパイルエラーになる

 

問3

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

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

A. 「B」と表示される
B. 「AB」と表示される
C. 「BA」と表示される
D.   コンパイルエラーになる

 

 

いかがでしょうか?

 

 

答えは問1がD問2がF、問3がDです。

 

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

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

続きを見る

 

コンストラクタのポイントと解説

コンストラクタはそのクラスのインスタンスが生成されたときに、初期処理を行うメソッドです。

構文は以下の通りで、次のような特徴があります。

・メソッド名はクラス名と同じ
・戻り値の型やvoidは不要
・引数をとることができる

class クラス名 {
   public クラス名() {
  処理文
   }
}

 

コンストラクタ自体は比較的理解しやすいのですが、クラス継承と組み合わさると急激に複雑になります。

その理由としては、次のようなルールがあるからです。

クラス継承時のルール

● 子クラスのコンストラクタにsuper()を記載すると、親クラスのコンストラクタを呼び出せる

● super(引数)とすると親クラスの引数持ちのコンストラクタを呼び出せる

● super()は子コンストラクタ内の1番最初に記載しないとコンパイルエラーになる

子コンストラクタ内にsuper()の記載がない場合、暗黙的に処理の最初にsuper()が実行される

super()で呼び出される親コンストラクタが存在しない場合、コンパイルエラーになる

super()とthis()の両方を書くとコンパイルエラーになる


このようにクラス継承時のコンストラクタのルールは多くあります。

これらのルールについて、解説していきます。

 

明示的に親コンストラクタを呼び出す

子クラスのコンストラクタ内にsuper()と記載すると、親クラスのコンストラクタを呼び出すことができます。

これを明示的呼び出しと言います。

明示的呼び出しの注意点としては、super()は子コンストラクタ内の一番最初に書かないとコンパイルエラーになります。

そのため、次のようなプログラムではコンパイルエラーになります。

public Child extends Parent{
 public Child() {
  System.out.print("child");
  super();                               //コンパイルエラー
 }
}

 

暗黙的に親コンストラクタを呼び出す

子コンストラクタにsuper()を書かなくても、自動的に処理の最初にsuper()が実行されます。

これを暗黙的呼び出しと言います。

次のように、super()がない子コンストラクタでも、実行時に最初にsuper()が付けられます。

■プログラム
public Child extends Parent{
 public Child() {
  System.out.print("child");
 }
}

■実行時
public Child extends Parent{
 public Child() {
  super();
  System.out.print("child");
 }
}

 

また、暗黙的呼び出しでは引数を持つsuper(引数)を書いていても、最初にsuper()が自動的に実行されます。

■プログラム
public Child extends Parent{
 public Child() {
  super("A");
 }
}

■実行時
public Child extends Parent{
 public Child() {
  super();
  super("A");
 }
}

 

super()で呼び出される親コンストラクタが存在しない場合はコンパイルエラー

次の例のように子コンストラクタでsuper()を呼び出しても、親コンストラクタに引数なしのコンストラクタがなければコンパイルエラーになります。

class Parent {
 public Parent(int a){
  }
}

public Child extends Parent{
 public Child() {
  super();                 //コンパイルエラー
 }
}

 

super()とthis()を両方書くとコンパイルエラーになる

this()はそのクラス内の別のコンストラクタを呼び出します。

しかし、次のようにsuper()とthis()が両方あるとコンパイルエラーになります。

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

 

this()については次の記事で詳しく解説していますので、こちらをご参考ください。

※記事作成中

 

解説

ポイントがいくつもあり複雑ですが、しっかり理解ができていれば今回の問題はすべて解くことができます。

 

問1

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

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

A. 「ペンギン」と出力される
B. 「ペンギン鳥動物」と出力される
C. 「動物ペンギン」と出力される
D. 「動物鳥ペンギン」と出力される
E.     何も表示されない
F.     コンパイルエラーになる

 

この問題ではAnimalクラスがBirdクラスに継承され、BirdクラスがPenguinクラスに継承されています。

Mainクラスの3行目では、AnimalクラスのPenguinインスタンスが生成されていますが、継承関係より問題ありません。

このとき、Penguinのコンストラクタが実行されるので、最初のプログラムの14行目が呼び出されます。

ここで、子クラスのコンストラクタではまず暗黙的にsuper()が実行され、親クラスのコンストラクタが呼び出されるので、9行目のBirdクラスのコンストラクタが呼び出されます。

さらに、BirdクラスもAnimalクラスの子クラスなので、暗黙的に2行目のAnimalクラスのコンストラクタが呼び出されます。

したがって、処理の順番はAnimalクラス→Birdクラス→Penguinクラスとなるので、「動物鳥ペンギン」が出力されます。

よって、答えはDです。

 

問2

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

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

A. 「B」と表示される
B. 「AB」と表示される
C. 「b」と表示される
D. 「bA」と表示される
E. 「Ab」と表示される
F. コンパイルエラーになる

 

この問題ではBクラスがAクラスを継承しています。

Mainクラスの3行目で、Bインスタンスが生成されます。

このとき、引数が与えられているので引数持ちのBコンストラクタ(7行目)が呼び出されます。

引数持ちのBコストラクタには明示的な親コンストラクタの呼び出しがないので、暗黙的にまずsuper()が実行されます。

しかし、親クラスのAクラスには引数なしのコンストラクタがないため、コンパイルエラーになります。

よって、答えはFです。

 

問3

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

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

A. 「B」と表示される
B. 「AB」と表示される
C. 「BA」と表示される
D.   コンパイルエラーになる

 

この問題ではBクラスがAクラスを継承しています。

Mainクラスの3行目でBインスタンスが生成され、Bクラスのコンストラクタが実行されます。

しかし、Bクラスのコンストラクタにはsuper()が書かれていますが、コンストラクタ内の先頭にないのでコンパイルエラーになります。

よって、答えはDです。

 

 

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

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

続きを見る

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

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