JAvaにおける抽象クラスとインタフェースの違い

6586 ワード

面接でよく聞かれる質問ですが、私たちはいったいどう答えたらいいのでしょうか.
文法面
まず、java言語では、抽象クラスとインタフェースは文法的にいくつかの違いがあり、以下にまとめられています.
同じ点
  • はいずれも上層に位置する抽象層である.
  • はインスタンス化できません.
  • はいずれもメソッドのみを宣言することができ、実現しない.
  • 異なる点
  • 抽象クラスには抽象的でない方法があり得る.すなわち、ある方法にはデフォルトの実装があり、インタフェースにはできない.
  • 抽象クラスを使用してextendsキーワードを統合し、インタフェースはimplementキーワードを使用して実現する.
  • 抽象クラスにはコンストラクタがあり、インタフェースはできない.
  • 抽象クラスのメソッドはpublic,protected,defaultなどの修飾子を用いることができ,インタフェースはpublic.
  • のみである.
  • 抽象クラスはmainメソッドがあり、インタフェースはできません.
  • 抽象クラスを継承するクラスはすべての抽象方法を実現しなければならない.そうしないと、自身も抽象クラスであり、インタフェースの実現クラスはすべての抽象方法を実現しなければならない.
  • デザイン思想の面
    上の文法の知識は重要ですか.重要です.知らないと使えません.
    しかし、上記の違いは、あるシーンでどれを使うべきかを判断するのに十分ですか?
    いいえ、彼を使うには彼らの最も重要なのは設計思想の面だと思います.
    もし、Doorのクラスを設計するなら、私たちは両方の方法で実現することができます.
       
    abstract class AbstractDoor {
    
      public abstract void open();
    
      public abstract void close();
    
    
    }
    
    //  
    interface Door {
    
      void open();
      void close();
    
    }
    

    この2つの実現はどちらがいいですか?まあまあ、わかりやすいです.
    では、 にアラーム機能を追加し、防犯ドアになる必要があります.どうしますか.
    abstract class AbstractDoor {
    
      public abstract void open();
    
      public abstract void close();
    
      public abstract String alarm();
    
    }
    
    interface Door {
    
      void open();
      void close();
      void alarm();
    
    }
    

    上記のコードをこのように変更しますか?これでいいですか.
    よく考えてみると、ドアは実体で、ドアの抽象クラスには警報機能があるはずですか?
    だから、私たちがすべきことはこうです.
    abstract class AbstractDoor {
    
      public abstract void open();
    
      public abstract void close();
    
    }
    
    interface Alarmable {
    
      void alarm();
    
    }
    

    抽象クラスAbstractDoorを定義し、 のベースクラスとして、同時にalarmableのインタフェースを定義します.
    1つのドアの抽象クラスを定義し、すべてのドアにはこの2つの方法が必要である.(スイッチできないドアは何と呼ばれているのか!)同時に のインタフェースを定義し、盗難防止ドアが必要な場合、AbstractDoorを継承し、同時にAlarmableのインタフェースを実現するだけで、この3つの方法がある.
    同時に、このような拡張性は極めて良くて、ドアがもっと共通の方法があるべきだと発見したとき、例えば、 、あなたはAbstractDoorの中で拡張することができて、あなたが警報できる窓が必要な時、あなたはAlarmableインターフェースを実現することができます.エイズではありませんか.
    面接の中でどのように答えて私は正しい答えを出す勇気がなくて、しかし私は、コードは人に読むことができると思って、だからあなたは正しい設計と正しい命名が必要で、コードの読者に一目で分かるようにして、文法に深く入り込むのではありませんて、結局文法は創造することができます.そうしないと、私たちは抽象類とインタフェースの違いが必要です.すべてのプロジェクトで使われている方法を直接一つのクラスに詰め込めばいいのではないでしょうか.
    注意事項
    本文の区別は通俗的な意味での区別に限られる.
    さらにjava 8では、抽象クラスとインタフェースの構文の違いを減らすために、インタフェースにデフォルトのメソッドと静的メソッドを導入しようと試みています.Java 8の後、インタフェースにデフォルトの実装方法を提供し、サブクラスを強制することなく実装することができます.興味のある太った友は、ここに移動して1ハ.Java 8インタフェースの静的方法とデフォルト方法を表示することができます.
    終わります.
    ChangeLog 2018-11-18完成
    以上はすべて個人の考えで得たもので、間違いがあれば評論区の指摘を歓迎します.
    転載を歓迎します.署名して原文のリンクを残してください.
    メールアドレス:[email protected]
    更多学习笔记看个人博客------->呼延十