Java筆記試験面接-抽象クラスとインタフェース


抽象クラス
定義:簡単に言えば,キーワードabstractで修飾されたクラスを抽象クラスと呼ぶ.使用:
abstract class AbstractAnimal {
    public AbstractAnimal() {
        System.out.println("Init AbstractAnimal.");
    }
    static String name = "AbstractAnimal";
    public abstract void eat();
    public void run() {
        System.out.println("AbstractAnimal Run.");
    }
}
class Animal extends AbstractAnimal {
    public static void main(String[] args) {
        AbstractAnimal animal = new Animal();
        animal.run();
        System.out.println(animal.name);
        animal.eat();
    }
  //           
    @Override
    public void eat() {
        System.out.println("Animal Eat.");
    }
}

実行結果:
Init AbstractAnimal.
AbstractAnimal Run.
AbstractAnimal
Animal Eat.

抽象メソッド:abstractキーワードを使用して修飾するメソッドを抽象メソッドと呼び、抽象メソッドはメソッド体がないことを宣言するだけです.次のコードがあります.
public abstract void m();

抽象クラスの特性:
  • 抽象クラスは
  • に初期化できない.
  • 抽象クラスは、構築方法
  • を有することができる.
  • 抽象クラスのサブクラスが一般クラスである場合、抽象クラス内のすべての抽象メソッド
  • を書き換える必要がある.
  • 抽象クラスのメソッドは、抽象メソッドまたは一般メソッド
  • であることができる.
  • クラスに抽象メソッドが含まれている場合、このクラスは抽象クラス
  • でなければなりません.
  • 子クラスの抽象メソッドは、親クラスの抽象メソッドと同名の
  • は使用できません.
  • 抽象メソッドはprivate、static、finalなどのキーワード修飾
  • にはできません.
  • 抽象クラスには通常のメンバー変数を含めることができ、アクセスタイプは任意に指定することもできるし、静的変数(static)
  • を使用することもできる.
    インタフェース
    定義:インタフェース(interface)は抽象クラスの延長であり、1つのクラスが複数のインタフェースを実現することができ、抽象クラスが多く継承できない欠陥を補うことができ、インタフェースはクラスの説明であり、interfaceキーワードを使用して宣言される.使用:
    interface IAnimal {
        void run();
    }
    class AnimalImpl implements IAnimal {
        public static void main(String[] args) {
            IAnimal animal = new AnimalImpl();
            animal.run();
        }
        @Override
        public void run() {
            System.out.println("AnimalImpl Run.");
        }
    }
    

    面接問題について
    1.抽象クラスにメソッドを含めることはできますか?答え:抽象クラスにメソッド体を含めることができます.抽象クラスの構成は完全にメソッド体を含む一般的なメソッドであってもよいが,これは抽象クラスの最適な使用方法ではない.
    テーマ解析:メソッド体を含む抽象クラスのサンプルコードは以下の通りです.
    abstract class AbstractAnimal {
        public void run() {
            System.out.println("AbstractAnimal Run.");
        }
    }
    class Animal extends AbstractAnimal {
        public static void main(String[] args) {
            AbstractAnimal animal = new Animal();
            animal.run();
        }
    }
    

    実行結果:AbstractAnimal Run.2.抽象クラスをインスタンス化できますか?どうして?答え:抽象クラスはインスタンス化できない.抽象クラスとインタフェースの設計はサブクラスの行為の特徴を規定するために使用されるため、他のクラスに継承させることであり、多態思想の設計体現であるため、抽象クラスはインスタンス化できないことを強制的に規定している.
    3.抽象的な方法はprivateで修飾できますか?どうして?答え:抽象メソッドはprivate修飾を使用できません.抽象メソッドはサブクラスに書き換えを継承するため、privateを設定するとサブクラスはこの抽象メソッドを書き換えることができません.これは抽象メソッドの設計理念に反しているので、private修飾はできません.
    4.次のオプションを追加しても、コンパイラのエラーは発生しませんか?
    abstract class AbstractAnimal {
        static String animalName = "AbstractAnimal";
          //      
    }
    

    A:protected abstract void eat(); B: void eat(); C:abstract void eat(){}; D:animalName += “Cat”;
    A:A
    テーマ解析:オプションBの一般的な方法には方法体が必要です.オプションC抽象メソッドにメソッド体があることはできません.オプションD変数付与操作はメソッド内でなければなりません.
    5.以下の抽象類と抽象方法について正しいのは?A:抽象クラスのメソッドはすべて抽象メソッドBである必要があります:抽象クラスには抽象メソッドCが含まれている必要があります:抽象クラスには一般メソッドDを含めることはできません:抽象クラスのメソッドはすべて一般メソッド(メソッドボディを含む)とすることができます
    答え:D
    テーマ解析:抽象クラスにメソッドがないか、すべて普通のメソッドであり、以下のコードに示すように許可されます.
    abstract class AbstractAnimal {
        public void run() {
            System.out.println("AbstractAnimal Run.");
        }
    }
    class Animal extends AbstractAnimal {
        public static void main(String[] args) {
            AbstractAnimal animal = new Animal();
            animal.run();
        }
    }
    
    

    プログラムの実行結果は次のとおりです.
    AbstractAnimal Run.
    

    6.インタフェースは普通のクラスと何の関係がありますか.答え:Java言語設計では、インタフェースはクラスではなく、インタフェース記述の統一フォーマットに従って定義する必要があるクラスの需要記述のセットです.
    7.インタフェースにメソッドがありますか?答え:JDK 8の前にインタフェースは方法体があることができなくて、JDK 8の後でstaticの方法とdefaultの方法を追加して、方法体を含むことができます.
    8.次のコードを実行すると、どのような結果が出力されますか?
    interface IAnimal {
        static String animalName = "Animal Name";
    }
    class AnimalImpl implements IAnimal {
        static String animalName = new String("Animal Name");
        public static void main(String[] args) {
            System.out.println(IAnimal.animalName == animalName);
        }
    }
    

    答え:実行結果はfalseです.
    サブクラスはnew String…変数animalNameを再作成し、==を使用してメモリアドレスの比較を行うのでfalseとなります.
    9.抽象クラスとインタフェースの違いは何ですか?答え:抽象クラスとインタフェースの違いは、主に以下のいくつかの部分に分かれています.
  • デフォルトメソッド
  • 抽象クラスは、デフォルトの方法の実装
  • を有することができる.
  • JDK 8以前のインタフェースにはデフォルトメソッドの実装はできず、JDK 8以降のインタフェースにはデフォルトメソッドの実装
  • がある.
  • 継承方式
  • サブクラスextendsキーワードを使用して抽象クラス
  • を継承
  • サブクラスimplementsキーワードクラス実装インタフェース
  • コンストラクタ
  • 抽象クラスは、コンストラクタ
  • を有することができる.
  • インタフェースにコンストラクタ
  • は使用できません.
  • メソッドアクセス修飾子
  • 抽象メソッドはpublic/protected/defaultなどの修飾子
  • を用いることができる.
  • インタフェースのデフォルトはpublicアクセス修飾子であり、他の修飾子
  • は使用できません.
  • マルチ継承
  • サブクラスは抽象クラス
  • しか継承できません.
  • サブクラスは、複数のインタフェース
  • を実装することができる.
    10.以下の抽象的な方法の説明が正しいのは?A:抽象方法は静的(static)のB:抽象方法は同時にローカル方法(native)C:抽象方法はsynchronizedでDを修飾することができる:以上すべてではない
    答え:D
    テーマ解析:抽象方法は布団類の書き換えが必要で、静的方法は書き換えることができないので、抽象方法は静的(static)に修飾されてはいけない.ローカルメソッドはローカルコードによって実現されるメソッドであり、抽象メソッドは実現されないため、抽象メソッドは同時にローカルメソッドではない.synchronizedはメソッドの実装の詳細に関係するが、抽象メソッドは実装の詳細に関係しないため、抽象メソッドはsynchronizedによって修飾されない.