【JavaSEコラム64】抽象クラスと抽象インタフェース、インスタンス化できないクラスは何に使えるの?

著者のホームページ:デザイナー Xiao Zheng
著者の簡単な紹介: JAVA テクノロジ、システム カスタマイズ、リモート ガイダンスに重点を置いた 3 年間の JAVA フルスタック開発経験、エンタープライズ デジタル トランスフォーメーションに専念、CSDN カレッジおよび Blue Bridge クラウド コースの認定講師。
主な方向性: Vue、SpringBoot、WeChat アプレット

この記事では、Java の抽象クラスと抽象インターフェイスの概念と構文を説明し、サンプル コードを示します。抽象メソッドは、宣言のみを持ち実装を持たず、サブクラスによって実装する必要があるメソッドです。インターフェイスは、一連のメソッドのシグネチャを定義する抽象型ですが、これらのメソッドの特定の実装コードは実装しません。

ここに画像の説明を挿入


1. 抽象クラスとは

Java では、抽象クラスはインスタンス化できないクラスであり、他のクラスの基本クラスとしてのみ使用できます。

抽象クラスはabstract、抽象メソッドと非抽象メソッドを含むキーワードによって宣言されます。抽象メソッドは、宣言されるだけで実装されないメソッドです。それらはサブクラスによって実装される必要があります。非抽象メソッドは、特定の実装を持つメソッドです。サブクラスは直接実行できます。継承して使用します。

抽象クラスには次の4 4 があります。4つの特徴をしっかりと学んでください。

  1. 抽象クラスはインスタンス化できません。抽象クラスはオブジェクトを直接作成できず、親クラスとしてのみ継承できます。
  2. サブクラスは抽象メソッドを実装する必要があります。クラスが抽象クラスを継承する場合、サブクラスも抽象クラスでない限り、その抽象クラス内のすべての抽象メソッドを実装する必要があります。
  3. サブクラスは非抽象メソッドを継承できます。抽象クラスには非抽象メソッドを含めることができ、サブクラスはこれらの非抽象メソッドを直接継承して使用できます。
  4. 抽象クラスにはメンバー変数と構築メソッドを含めることができます。抽象クラスは、継承およびサブクラスで使用するためのメンバー変数と構築メソッドを定義できます。

抽象クラスの主な機能は、コードの再利用性とスケーラビリティを実現することです。抽象クラスを定義することで、いくつかの共通の属性とメソッドを抽象化し、サブクラスが特定のビジネス ロジックを継承して実装できるようにします。抽象クラスも使用できます。いくつか定義することをお勧めします。共通のインターフェイスと制約により、コードの標準化と保守性が向上します。

以下は、抽象クラスの使用法を示すサンプル コードです。実行するためにターミナルにコピーしてください。

// 抽象类
abstract class Animal {
    
    
   // 抽象方法
   public abstract void sound();
   // 非抽象方法
   public void sleep() {
    
    
      System.out.println("Animal is sleeping.");
   }
}

// 子类
class Dog extends Animal {
    
    
   // 实现抽象方法
   public void sound() {
    
    
      System.out.println("Dog is barking.");
   }
}

// 子类
class Cat extends Animal {
    
    
   // 实现抽象方法
   public void sound() {
    
    
      System.out.println("Cat is meowing.");
   }
}

public class Main {
    
    
   public static void main(String[] args) {
    
    
      Animal dog = new Dog();
      dog.sound(); // 输出: Dog is barking.
      dog.sleep(); // 输出: Animal is sleeping.

      Animal cat = new Cat();
      cat.sound(); // 输出: Cat is meowing.
      cat.sleep(); // 输出: Animal is sleeping.
   }
}

上の例では、Animal は抽象クラスであり、抽象メソッドsound()と非抽象メソッドが含まれていますsleep()。Dog と Cat は両方とも Animal のサブクラスであり、抽象メソッドを実装する必要がありますsound()

Animal タイプのオブジェクト参照を作成しdogcat対応するメソッドを呼び出すことで、さまざまなサブクラス オブジェクトのさまざまな動作を確認できます。

抽象クラスはインスタンス化ができず継承のみが可能な特殊なクラスで、クラスのインタフェースや仕様を定義する仕組みを提供し、コードの再利用性や拡張性を実現します。

ここに画像の説明を挿入


2. インターフェースとは

Java では、インターフェイスは一連のメソッドのシグネチャを定義する抽象型ですが、それらのメソッドを実装する具体的な実装コードはありません

インターフェイスはクラスによって実装できます。クラスはインターフェイスを実装した後、そのインターフェイスで定義されているすべてのメソッドを実装する必要があります。

以下は、Shape という名前のインターフェイスを示す簡単なサンプル コードです。これをターミナルにコピーして実行してください。

// 定义一个 Shape 接口
interface Shape {
    
    
    double getArea();  // 获取形状的面积
    double getPerimeter();  // 获取形状的周长
}

// 实现 Shape 接口的圆形类
class Circle implements Shape {
    
    
    private double radius;
    
    public Circle(double radius) {
    
    
        this.radius = radius;
    }
    
    public double getArea() {
    
    
        return Math.PI * radius * radius;
    }
    
    public double getPerimeter() {
    
    
        return 2 * Math.PI * radius;
    }
}

// 实现 Shape 接口的矩形类
class Rectangle implements Shape {
    
    
    private double width;
    private double height;
    
    public Rectangle(double width, double height) {
    
    
        this.width = width;
        this.height = height;
    }
    
    public double getArea() {
    
    
        return width * height;
    }
    
    public double getPerimeter() {
    
    
        return 2 * (width + height);
    }
}

public class Main {
    
    
    public static void main(String[] args) {
    
    
        Circle circle = new Circle(5.0);
        System.out.println("圆形的面积:" + circle.getArea());
        System.out.println("圆形的周长:" + circle.getPerimeter());
        
        Rectangle rectangle = new Rectangle(3.0, 4.0);
        System.out.println("矩形的面积:" + rectangle.getArea());
        System.out.println("矩形的周长:" + rectangle.getPerimeter());
    }
}

上記のコードでは、Shape形状の面積と周囲を取得するメソッドが含まれる という名前のインターフェイスを定義しました。

Circle次に、2 つのクラスと を作成しましたRectangle。これらはどちらもShapeインターフェイスを実装しており、インターフェイスにメソッドを実装する必要があります。

最後に、main 関数でCircleオブジェクトとRectangleオブジェクトを作成し、それらのメソッドgetAreagetPerimeterメソッドを呼び出してそれぞれ面積と周囲長を取得します。

ここに画像の説明を挿入


3. 抽象クラスとインターフェースの違い

Java では、抽象クラスとインターフェイスの両方がクラスとクラス間の関係を実装するために使用されますが、いくつかの違いがあります。

  1. 実装方法
    • 抽象クラスは、メンバー変数、構築メソッド、通常のメソッド、抽象メソッドなどを含めることができる通常のクラスであり、メソッド実装コードを持つことができます。
    • インターフェイスは、定数と抽象メソッドのみを含めることができる特別なクラスであり、メンバー変数とメソッドの実装コードを持つことはできません。
  2. 継承関係
    • キーワードを使用して継承を実現することにより、クラスは 1 つの抽象クラスのみを継承できますextends
    • クラスは、implementsインターフェイスを実装するキーワードを使用して複数のインターフェイスを実装できます。
  3. メソッド定義:
    • 抽象クラスの抽象メソッドは、メソッド本体または通常のメソッドの実装コードを持つことができます。
    • インターフェイス内のメソッドはすべて抽象メソッドであり、メソッド本体はなく、メソッドのシグネチャのみが存在します。
  4. 用途:
    • 抽象クラスは、共通の概念を表すために使用されます。共通のプロパティとメソッドを含めることができ、サブクラスによって実装されるいくつかの抽象メソッドを定義することもできます。
    • インターフェイスは、一連の操作を定義し、動作の能力を表現し、インターフェイスを実装することで特定の動作を持つクラスの能力を表現するために使用されます。

つまり、抽象クラスとインターフェイスの両方は、クラスとクラス間の関係を実現するために使用されます。抽象クラスは共通の属性とメソッドの定義に適しており、インターフェイスは動作の定義に適しています。これらを使用する場合は、特定のクラスに基づく必要があります。ニーズと設計目標に基づいて、適切な抽象クラスまたはインターフェイスを選択してください。

ここに画像の説明を挿入


4. 抽象クラスとインターフェイスに関するインタビューの質問

  1. 抽象クラスとインターフェイスの違いは何ですか? いつ使用されますか?
  2. クラスは抽象クラスを継承し、同時にインターフェイスを実装できますか? なぜ?
  3. 抽象クラスに抽象メソッドを含めることはできませんか? インターフェースにメソッドを含めることはできませんか?
  4. 抽象クラスとインターフェイスのメンバー変数の違いは何ですか?
  5. インターフェイスはインターフェイスから継承できますか? 抽象クラスは抽象クラスを継承できますか?
  6. インターフェイス内で静的メソッドを定義できますか? 抽象クラスではどうなるでしょうか?
  7. ポリモーフィズムの観点から、抽象クラスとインターフェイスはどのように異なりますか?
  8. Java では多重継承がサポートされていないのはなぜですか? インターフェースはこの問題をどのように解決するのでしょうか?
  9. Java 8 のインターフェースにはどのような新機能が追加されましたか?
  10. いつ抽象クラスを使用し、いつインターフェイスを使用する必要がありますか?

ここに画像の説明を挿入


V. まとめ

この記事では、Java の抽象クラスと抽象インターフェイスの概念と構文、およびサンプル コードを説明し、次回のブログでは Java の内部クラスの知識ポイントを説明します。

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_41464123/article/details/132054198