Java の extends と implements はオブジェクト指向プログラミングの継承の概念を実装するために使用されますが、両者の間には微妙な違いがあります。 extends キーワードは主にクラスを拡張する、つまり Java でサブクラスを作成するために使用され、imprines キーワードは Java でインターフェイスを実装するために使用されます。 extendsキーワードは、インターフェイスが他のインターフェイスを拡張する際にも使用されます。 extendsとimplementsの違いを理解するためには、Javaのclassとinterfaceの違いも学び、理解する必要があります。
どちらもオブジェクト指向の手法を用いたアプリケーション開発に不可欠な要素ですが、インターフェイスはクラスよりも抽象度が高いため、APIや契約を定義するために使用されます。
一方、クラスはインターフェイスの具体的な実装、つまり仕事をするための実際のコードを提供します。 クラスは契約を定義するために抽象化することもできますが、それはJavaでインターフェイスによって最もよく行われる仕事です。 C++ に比べて制限されている Java での多重継承を促進するためです。
Java 8 以降でも、Java では型と動作の多重継承のみがサポートされていますが (Java 8 ではデフォルトのメソッドを導入)、状態の多重継承はまだサポートされていません。
また、もしあなたがJavaの世界に入ったばかりなら、UdemyのThe Complete Java MasterClassでより良い、より構造化された方法でJavaを学ぶことをお勧めします。
クラスを拡張することの意味
Javaのクラスは、他のクラスを拡張してサブクラスになることができます。 クラスBがクラスAを拡張すると、Bはサブクラス(子)、Aはスーパークラス(親)になります。 サブクラスは親クラスのすべての機能を再利用することができ、コードの再利用はクラスを拡張する主な理由ですが、より重要なのは後にポリモーフィズムによって活用される定義関係であることを理解している人はほとんどいません。 これは、実装よりもインタフェースのためのプログラミングとして知られる、柔軟なソフトウェアを作成するテクニックを生み、コアアルゴリズムを定義するために常に親クラスまたはインタフェースの変数を使用します。
class A { public void show() { System.out.println("show"); }}class B extends A { public void display() { System.out.println("display"); } public void show() { System.out.println("better show"); }}public class Main { public static void main(String args) { A a = new B(); // B extends A a. B. B { public void display() { System.out.println("show");}}public class A { public static void main(String args) { A a = new B(); // A を継承するので可能になる。show(); // これはクラス B の show() メソッドを呼び出します }}Outputbetter show
クラス A を拡張することで、B は show() メソッドにアクセスでき、さらに show() メソッドの動作をオーバーライドできることがわかりますが、これは Java ではメソッドのオーバーライドとして知られているものです。 この巨大な力は extends キーワードを使用することで得られます。
また、実装よりもインターフェイスのためにプログラミングする技術について詳しく知るには、Java の Head First Design Pattern を読むことができます。
interface を実装することの意味
interface を実装することの意味は、クラスを拡張することとあまり変わりませんが、さらに注意点があります。 クラスがインターフェイスを実装する場合、インターフェイス内で宣言されたすべてのメソッドの実装を提供する必要があります。 すべての実装を提供したくない場合は、それ自体を抽象クラスとして宣言することができます。
これらのルールに従わない場合、プログラムはコンパイルできません。 Javaコードでインタフェースを実装する例はたくさんありますが、Runnableの実装が最もポピュラーだと思います。
class R implements Runnable{public void run(){ System.out.println("do nothing"); }}
Runable を期待するメソッドには、このインスタンスを渡せば、ExecutorService クラスの execute() と submit() メソッドの両方にタスクがスレッドプールで実行されます。 このクラスは、Runnableインターフェースのメソッドであるrun()メソッドを実装しているので、具象クラスであることがわかります。 もし、run()メソッドを実装していない場合は、classの前にabstractキーワードを付けて抽象化する必要があります(例)。
abstract class R implements Runnable{}
重要なポイント
以下は、Javaの extends と implements キーワードに関連する重要なポイントの一部です。
interface I{}class A{}class B extends A{}class C extends I{}
このソースファイルをコンパイルすると、次のエラーが発生します:
$ javac Main.javaMain.java:27: no interface expected hereclass C extends I{^1 error
2) クラスは1つのクラスしか拡張できないので、複数のクラスを拡張しようとすると、次のように再びコンパイルエラーになります:
class C extends A, B{}$ javac Main.javaMain.java:27: '{' expectedclass C extends A, B{^1 error
3) インターフェースでは extends キーワードを使って Java でサブインターフェスを作成できます。g.
interface J extends I{}
4) インターフェースは extends キーワードを使用して、次のように複数のインターフェースを拡張することもできます:
interface k extends I, J{}
5) クラスは implements キーワードを使って、次のように Java で一つ以上のインターフェースを実装することができます。
class D implements I, J, K{}
6) クラスは extends と implements キーワードを一緒に使って、クラスを拡張しインターフェースを実装することもできますが、これは次の例のように Java でかなり一般的です。
class E extends A implements I, J{}
クラスがこれを行うとき、それは今、AのサブクラスとIとJのサブインターフェイスです。つまり、以下のようにクラスEとインターフェイスI、Jの参照変数を使って、クラスEオブジェクトを格納できます。
I i = new E();J j = new E();A a = new E();
これは継承と多態性の使用という点でクラスEに非常に大きな力を与えています。
7) これは Java では違法で、コンパイラーは次のようなエラーを出します。
interface L implements J{}javac Main.javaMain.java:49: '{' expectedinterface L implements J{^1 error
以上、Java における extends と implements キーワードの違いについて説明しました。 extendsは一般的にクラスを拡張するのに使われ、implementsは一般的にインターフェイスを実装するのに使われることは明らかです。 しかし、クラスBが別のクラスAを拡張した場合、それはその子になり、クラスAは親になります。 インターフェイスも同様です。
Other Java Interview Questions you may like
- JavaにおけるAggregation、Association、Compositionの違いは何ですか? (回答)
- Javaの抽象クラスとインターフェイスの違いは何ですか? (回答)
- JavaにおけるInheritanceとPolymorphismの違いは何ですか? (回答)
- Javaにおける抽象化とポリモーフィズムの違いは? (回答)
- Javaで継承よりコンポジションが良い理由とは? (記事)
- Javaにおける静的変数と非静的変数の違いについて教えてください。 (回答)
- なぜJavaでは抽象クラスが重要なのですか? (意見)
Further Learning
Complete Java Masterclass
Java Fundamentals: Java言語
Java In-Depth: 完全なJavaエンジニアになる!
620