Interface vs Abstract class

3870 ワード

1. Abstract classes in java


最も簡単に言えば、abstractclassはabstractキーワードを使用して宣言されたclassである.クラスはabstractメソッドを有するか持たないかのいずれかである.JVMは抽象クラスを動作が完全に定義されていない不完全なクラスと見なす.classをabstractとして定義するには、1つだけ強制します.classのインスタンスを生成できません.

1) Syntax of abstract class

abstract class TestAbstractClass
{
    public abstract void abstractMethod();
    public void normalMethod()
    {
        //method body
    }
}
TestAbstractClassには2つの方法があります.抽象的な方法と一般的な方法.abstractメソッドを含むclassはabstractclassと宣言する必要があります.

2) Abstract method


abstract法はそこでは実現されていない方法である.アプリケーションで抽象メソッドを使用する唯一の方法は、クラスを拡張することです.サブクラスはスーパークラスの動作を継承することができ、スーパークラスはサブクラスへの参照を持つことができ、抽象クラスの重要性を高めます.

2. Interfaces in java


Javaには、どのクラスでもすべてのインタフェースを実装できるというルールがあるので、インタフェース内で定義されているすべての方法は共通でなければなりません.

1) Syntax of interface

public interface TestInterface
{
    void implementMe();
}
上記のインタフェースを実装するすべてのクラスは、impleMentMe()メソッドを上書きする必要があります.

2) Abstract class implementing interface


インタフェースの実装時に内部メソッドを上書きしない場合は、実装されたクラスをabstractとして定義する場合のみです.
public abstract class TestMain implements TestInterface
{
    //No need to override implement Me
}
その他の場合は、implementMe()メソッドを無条件に上書きする必要があります.
public class TestMain implements TestInterface
{
    @Override
    public void implementMe() {
        // TODO Auto-generated method stub
    }
}

3. Abstract classes vs Interfaces

  • アクセス制御者
  • インタフェースのすべての方法はpublic&abstractとして自動的に使用されます.
  • 抽象クラスのメソッドは、アクセス制御者を自由に使用することができる.また,非abstractメソッドについても静的に宣言することができる.
  • 内部メソッド定義
  • インタフェースには、完全に定義された方法はありません.インタフェースは詳細のみを提供します.
  • abstract classは非抽象的な方法に何の制約もありません.他のクラスのメソッドと同様に定義できます.
  • マルチ継承
  • の任意のクラスは、複数のインタフェースを実装することができる.
  • 抽象クラスは1つしか継承できません.
  • 4.いつ使用するか


    1) Partial behavior with abstract classes


    抽象クラスでは、いくつかの動作を定義できます.HttpServiceletの例を表示します.サーブレットテクノロジーを使用したWebアプリケーションを開発する場合、このクラスは常に継承する必要があります.各servletには、初期化、サービス、破棄のライフサイクルフェーズがあります.servletを作成するたびに、各ステップに新しいコードを記述する必要がある場合は、大きな無駄になります.
    JDKデザイナーはこの問題を解決するためにHttpServicelet抽象クラスを作成した.ここでは,各段階について基本コードを記述した.ここでは、必要な方法をカバーすれば、使いやすくなります.

    2) Contract only interfaces


    インタフェースはclassのフィーチャーのみを定義し、インタフェースを強制的に実装するclassがすべてのフィーチャーを1つずつ実装する場合に使用できます.
    Collection FrameworkのMapインタフェースを考えてみましょう.ここではmapがどのように働くべきかのルールのみを定義します.たとえば、key-valueペアを保存するか、valueがkeyでアクセスする必要があります.これらの規則はインタフェース内で抽象的な方法で定義される.
    これらの機能を実装するクラス(HashMap、HashTable、TreeMapなど)は、インタフェース内の方法を異なるように実装し、他の異なる特徴を有する.
    さらに、インタフェースは、責任分離を定義するために使用することができる.たとえば、HashMapは、Map、Serializable、Cloneableの3つのインタフェースを実装します.各インタフェースは、分離の責任を定義するので、classが必要なインタフェースを選択して実装できます.

    3)例



    第一の親である生物は生物を定義する抽象類である.それらを継承するAnimal,Plant abstractclassは,それぞれ動物,植物の特性をabstract法と定義している.
    インタフェースの使用目的は,Eatableインタフェースを用いることにより,Animal,Plantがそれぞれ異なる親のMonkey,Kimなどのclassを継承する共通の機能である食事機能を実現していることがわかる.つまり,継承関係が異なっていても,同じ機能を強制的に実行することができる.
    上のTalkableインタフェースは、同じ親AnimalのKim,Gilを継承して使用する機能です.したがって,下図のようにHuman Abstract classを生成し,Kim,Gilに継承させることで,汎用機能(Talkable)を強制的に実現できる.

    リファレンス

  • https://howtodoinjava.com/java/oops/exploring-interfaces-and-abstract-classes-in-java/
  • https://velog.io/@gillog/Java-Interface-vs-Abstract-Class-%EC%A0%95%EB%A6%AC