1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

インターフェースの多重継承(Java Silver)

Last updated at Posted at 2021-06-23

はじめに

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?