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

必ず出る!クラス継承の問題【Java Silver例題】

Java Silver 例題

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

今回は、クラスの継承についての問題です。

 

クラス継承は実際の業務でも使用する機会が多く、重要度では非常に高いです。

そのため、Java Silverでは必ず出題される問題です

 

問題:クラス継承について

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

問1

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

A.   AAA
B.   BBB
C.   CCC
D.   コンパイルエラー

 

問2

次のプログラムで継承するための正しい修正を選びなさい。(2つ選択)

A.   2行目にpublicを加える
B.   2行目のfinalを削除する
C.   5行目のpublicを削除する
D.   11行目にpublicを加える
E.   14行目にprotectedをprivateに変更する

 

いかがでしょうか?

 

 

答えは問1がD問2がBとCです。

 

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

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

続きを見る

 

クラス継承のポイントと解説

クラス継承のポイントは次の通りです。

ポイント

●同時に2つ以上のクラスを継承できない

●finlaがついたクラスやメソッドを継承するとコンパイルエラーになる

●アクセス修飾子は親クラスよりも広いものに

 

ポイントを1つずつ説明していきます。

 

同時に2つ以上のクラスを継承できない

クラスを継承するときの構文は次の通りです。

class 子クラス名 extends 親クラス名 {}

このとき、1度で継承できる親クラスは1つだけです。

そのため、次のように2つ親クラスを継承しようとするとコンパイルエラーになります。

class Child extends ParentA, ParentB{       //コンパイルエラー
}

 

finalがついたクラスやメソッドを継承するとコンパイルエラーになる

開発現場でもよくfinal修飾子が付いたクラスやメソッドを見ることがあります。

final修飾子は"変更できない"という意味です。

よく変数にfinalが付いてる場合がありますが、これはその変数を初期化後に別の値や文字を代入させない役割があります。

これと同じように、クラスやメソッドを継承して内容を変更させないようにするためにfinalを付けます。

 

アクセス修飾子は親クラスよりも広いものに

アクセス修飾子は非常に重要で、Javaの基礎の1つと言えるでしょう。

Java Silverでは必ず1問以上は出題されるので、アクセス修飾子の種類と範囲を理解しておく必要があります。

アクセス修飾子の種類と範囲は次の通りです。

アクセス修飾子 アクセス範囲
public どのクラスからもアクセスできる
protected 同じパッケージもしくは継承しているサブクラスからのみアクセス可能
なし 同じパッケージのクラスからアクセス可能
private クラス内からのみアクセス可能

1番上のpublicがアクセス範囲が最も広く、下にいくほどアクセス範囲は小さくなっていきます。

注意点はアクセス修飾子がない場合ではデフォルトの範囲が定められており同じパッケージのクラスからのアクセスしか許可しません。

なので、アクセス修飾子がないからといってアクセス制限がないという勘違いをしないようにしましょう。

 

この表は丸暗記することをおすすめします。

問題によっては、文書形式でアクセス範囲をそのまま問う場合もあります。

 

アクセス修飾子の種類と範囲を理解したところで、次に重要なのはクラス継承でのアクセス修飾子の使い方です。

親クラスのメソッドを子クラスで上書きすることをオーバーライドと言います。

オーバーライドでは、親クラスのアクセス範囲と同等それより広いアクセス修飾にする必要があります。

 

例えば、次のように親クラスでprotectedが付いたメソッドを子クラスでオーバーライドする場合、同等のprotectedそれ以上のpublicを付けないとコンパイルエラーになります。

class Parent {
protected void test(){ }
}

class ChildA extends Parent {
private void test(){ }           //コンパイルエラー
}

class ChildB extends Parent {
void test(){ }                       //コンパイルエラー
}

class ChildC extends Parent {
protected void test(){ }     //OK
}

class ChildD extends Parent {
public void test(){ }          //OK
}

 

解説

ここまでのポイントを抑えていれば、今回の問題はあっさり解くことができます。

 

問1

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

A.   AAA
B.   BBB
C.   CCC
D.   コンパイルエラー

この問題は、10行目でCクラスがAクラスとBクラスを同時に継承しているのでコンパイルエラーになります。

そのため、答えはDです

 

問2

次のプログラムで継承するための正しい修正を選びなさい。(2つ選択)

A.   2行目にpublicを加える
B.   2行目のfinalを削除する
C.   5行目のpublicを削除する
D.   11行目にpublicを加える
E.   14行目にprotectedをprivateに変更する

 

このコードは次の2つが原因でコンパイルエラーになります。

⑴ 2行目のfinal修飾子が付いているメソッドを、11行目でオーバーライドしている

⑵ 5行目のpublicが付いているメソッドを、12行目でpublicよりも範囲が狭いデフォルトのアクセス範囲でオーバーロードしている。

したがって、これらを解消できる修正を加える必要があります。

⑴ではfinal修飾子があるかぎりオーバーロードできないので、final修飾子を削除するBが正しいです。

⑵では14行目の子クラスのアクセス範囲が、5行目の親クラスのアクセス範囲よりも広くする必要があります。

Cでは、publicの削除により親クラスはデフォルトのアクセス範囲となるため、子クラスのprotectedの方がアクセス範囲が広くなるので正しいコードとなります

Eでは、子クラスのprotectedをprivateに変更しますが、変更後も親クラスのアクセス範囲よりも狭くなるため、コンパイルエラーになります。

 

そのため、答えはBとCです。

 

 

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

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

続きを見る

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

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