はじめに
Java SE 11 Silver取得に向けて学習中に、練習問題にて出題されたのでまとめてみました。
今回は4パターン紹介します。
継承の仕様(オーバーライド、オーバーロード)を把握していると、より理解しやすいかと思います。
また、共変戻り値に関しましては今回は取り上げませんでした。
※オーバーライド、オーバーロードを理解したい方は こちらの記事 を参照
パターン1
Interface_A.java
interface Interface_A{
void test();
}
Interface_B.java
interface Interface_B{
void test();
}
Interface_C.java
interface Interface_C extends Interface_A, Interface_B{
void test();//コンパイル可
}
- 全てのインターフェースが同じシグニチャのメソッドを宣言している場合です。
CにA Bのtest()をオーバーライドしていることになり、
コンパイル可能です。
パターン2
Interface_A.java
interface Interface_A{
void hoge();
}
Interface_B.java
interface Interface_B{
void test();
}
Interface_C.java
interface Interface_C extends Interface_A, Interface_B{
int test();//コンパイルエラー
int test(int num);//コンパイル可
}
- 1つ目はメソッド名が継承したBと同じかつ、戻り値が違う場合です。
オーバーライドを宣言していますが、戻り値が一致していないので
コンパイルエラーになります。(共変戻り値であればコンパイル可能) - 2つ目は戻り値、引数が違う場合です。
メソッド名は同じですが、シグニチャが違うためオーバーロード扱いとなり
コンパイル可能です。
パターン3
Interface_A.java
interface Interface_A{
void test();
}
Interface_B.java
interface Interface_B{
void test();
}
Interface_C.java
interface Interface_C extends Interface_A, Interface_B{
void hoge();//コンパイル可
}
- 継承したインターフェースのメソッドを1つもオーバーライドしていない場合です。
インターフェース、抽象クラスに継承または実装されたインターフェースのメソッドは、
任意での実装となり、実装しなくても実行可能です。
パターン4
Interface_A.java
interface Interface_A{
void hoge();
}
Interface_B.java
interface Interface_B{
void piyo();
}
Interface_C.java
interface Interface_C extends Interface_A, Interface_B{
void fuga();
}
Main.java
class Main implements Interface_C{
@Override
public void piyo() {}
@Override
public void hoge() {}
@Override
public int fuga() {}
}
- 多重継承されたインターフェースをクラスに実装する場合です。
実装するには、継承元全てのメソッドを実装してあげる必要があります。
パターン4ex
Interface_A.java
interface Interface_A{
void hoge();
}
Interface_B.java
interface Interface_B{
void piyo();
}
Interface_C.java
interface Interface_C extends Interface_A, Interface_B{
default void hoge(){}
default void piyo(){}
void fuga();
}
Main.java
class Main implements Interface_C{
@Override
public int fuga() {}
}
多重継承したインターフェースが親インターフェースの実装をdefaultにて行っている場合は
継承先での実装は任意となり、エラーにはなりません。
終わりに
人生で初めてブログを書いてみました。
アドバイスや質問がありましたら、よろしくお願いします!
Javaの継承関連やコンスタントプール関連は暗記で網羅するより、しっかりと
仕組みを理解することで様々なパターンに対応できるようになります。
私も試験が間近なので、ニアミスを減らすべく細かな仕様を復習していきたいと思います。
追記(2021/06/28)
無事、Java Silver SE11を合格しました。
正当率は84%でした。
まだ研修期間が続いていますので、出来ればGoldにも挑戦してみようと思います。
##参考
参考書:徹底攻略Java