Java の抽象クラスの概要

Java の抽象クラスの概要

抽象クラスには通常のクラスのメンバーを含めることができ、通常のクラスには通常の属性、メソッド、および内部クラスのメンバーを含めることができます。これらのメンバーは、抽象クラスのサブクラスによって継承して使用できます。また、抽象クラス自体によっても使用できます。抽象クラスの非抽象メソッドには具体的な実装が必要です。そうでない場合はコンパイルできません。抽象クラスにもコンストラクターを含めることができますが、抽象クラスを直接インスタンス化することはできないため、抽象クラスの場合、コンストラクターは主にサブクラスの初期化に使用されます。通常のクラスのメンバーに加えて、抽象クラスには抽象メソッドが含まれている必要があります。

では、抽象メソッドとは何でしょうか? すべての共通メソッドの上には「{}」があります。これはメソッド本体を意味し、メソッド本体を持つメソッドはオブジェクトによって直接使用される必要があります。抽象メソッドはメソッド本体のないメソッドを指します。抽象メソッドは、abstract キーワードによって変更する必要があります。

Java の抽象クラスが直接インスタンス化できない理由は、具体的な実装を提供せずにメソッド宣言の一部を定義しただけの不完全なクラスであるため、オブジェクトを作成できないためです。

抽象クラスの主な機能は、そのサブクラスにパブリック インターフェイスとメソッドを提供し、サブクラスが抽象メソッドを継承して実装できるようにすることです。抽象クラスには抽象メソッドが含まれており、抽象メソッドには具体的な実装がないため、抽象クラスでオブジェクトが作成されると、システムは抽象メソッドの呼び出しを正しく実行する方法を決定できません。したがって、Java の抽象クラスは、他のクラスの基本クラスとしてのみ使用でき、継承され、抽象メソッドを実装できます。

Java の抽象クラスは、インスタンス化できず、継承のみが可能な特別なクラスです。

抽象メソッドは、具体的な実装を持たず、サブクラスで実装する必要があるメソッドです。抽象メソッドの定義では、abstract キーワードを使用します。次に例を示します。

パブリック抽象 void 描画();

上記のコードは抽象メソッドdraw()を定義していますが、具体的な実装はありません。この抽象クラスを継承するサブクラスは、このメソッドを実装する必要があります。

抽象クラスには、抽象メソッドのほかに、具体的な実装を持つ非抽象メソッドを含めることもできます。サブクラスはこれらのメソッドを継承したり、オーバーライドしたりできます。

抽象クラスには 2 つの主な機能があります。

予期しない状況を回避するために、サブクラスの動作を強制します。

プログラミングの複雑さを軽減するために、抽象レベルで汎用関数を提供します。

クラスが抽象クラスを継承する場合、すべての抽象メソッドを実装する必要があり、それ以外の場合はクラスも抽象クラスとして宣言する必要があることに注意してください。同時に、抽象クラスはインターフェイスを実装することもできるため、インターフェイス内の一部のメソッドの実装を抽象クラスに配置して、サブクラスによる直接継承を容易にすることができます。

Java では、抽象クラスは、直接インスタンス化できず、他のクラスによってのみ継承できる特別なクラスです。抽象クラスは通常、いくつかの共通コードと動作をカプセル化し、いくつかの抽象メソッドを定義するための基本クラスとして使用されます。これらの抽象メソッドには特定の実装がなく、サブクラスによって実装する必要があります。

抽象クラスの定義にはabstractキーワードが使用され、抽象メソッドもabstractキーワードで修飾されます。クラスに抽象メソッドが含まれる場合、そのクラスは抽象として宣言される必要があります。

Java では、抽象クラスと抽象メソッドを含むサブクラスを同じファイルに格納できます。ソース ファイル内に存在できるパブリック クラスは最大 1 つだけであり、このパブリック クラスの名前はファイル名と同じである必要があることに注意してください。したがって、同じソース ファイル内で複数のクラスを定義する場合、そのうちの 1 つだけを public として宣言できます。ただし、通常はコードの読みやすさと保守性を向上させるために、コードを別のファイルに個別に保存することをお勧めします。
抽象クラスとそれに対応するサブクラスがある場合、通常は、抽象クラスを 1 つのファイルで定義し、そのサブクラスを別のファイルで定義します。これにより、各クラスがその実装を説明する独自の個別のファイルを持つようになるため、プログラムの読み取りと保守が容易になります。

以下は抽象クラスの例です。

ソースコードは2つのファイルで構成されています

Animal.java の内容は次のとおりです。

public abstract class Animal {
    protected String name;

    public Animal(String name) {
        this.name = name;
    }

    public abstract void eat();

    public void sleep() {
        System.out.println(name + " is sleeping...");
    }

    public String getName() {
        return name;
    }
}

 Cat.java の内容は次のとおりです。

public class Cat extends Animal {
    public Cat(String name) {
        super(name);
    }

    public void eat() {
        System.out.println(getName() + " is eating fish...");
    }

    public static void main(String[] args) {
        Cat cat = new Cat("Tom");
        cat.eat();  // Tom is eating fish...
        cat.sleep(); // Tom is sleeping...
    }
}

上記の例では、Animal クラスは抽象クラスであり、抽象メソッド Eat() と非抽象メソッド sleep() を定義します。Cat クラスは Animal クラスを継承して Eat() メソッドを実装し、次のメソッドを呼び出すこともできます。親クラスの sleep() メソッド。

抽象クラスと通常のクラスの違いは、抽象クラスはインスタンス化できず継承のみが可能であり、そのサブクラスはすべての抽象メソッドを実装する必要があることです。抽象クラスを使用すると、コードの再利用性とスケーラビリティが向上します。

抽象メソッドは実装を持たないメソッドであり、サブクラスで実装する必要があります。

コンストラクターとクラス メソッドの両方に具象実装があります。コンストラクターは、オブジェクトの作成とその状態の初期化に使用されます。オブジェクトにはインスタンス化される正確なコンストラクターが必要であるため、コンストラクターを抽象メソッドとして宣言することはできません。クラス メソッドは、オブジェクトではなくクラスに関連付けられたメソッドです。また、クラスのロード時に呼び出されるには具体的な実装が必要であるため、抽象メソッドとして宣言することもできません。

抽象クラスには、プロパティ、メソッド、コンストラクターを含めることができます。

抽象クラスのコンストラクターは新しいインスタンスには使用できません。サブクラスによってのみ呼び出すことができます。抽象クラスは完全な実装が存在しない不完全なクラスであるため、インスタンス化できません。

抽象クラスには必ずしも抽象メソッドが含まれる必要はありませんが、抽象メソッドを含むクラスは抽象クラスである必要があります。抽象メソッドを含まない抽象クラスは、呼び出し元にオブジェクトをインスタンス化させることが目的ではなく、通常は一部の特殊なクラスの構造設計に使用されます。 。

抽象クラスのサブクラスは、抽象親クラスのすべての抽象メソッドを書き換える必要があります。そうしないと、サブクラスも抽象クラスでない限り、コンパイル エラーが発生します (親クラスのすべての抽象メソッドが書き換えられていないと仮定すると、抽象メソッドは無意味です)。

抽象クラスのコンストラクターは、独自のメンバー変数を初期化するか、親クラスのコンストラクターを呼び出すために使用されます。サブクラスがオブジェクトを作成すると、親クラスのコンストラクターが自動的に呼び出され、親クラスの初期化が完了します。

完全な実験コードを示します。

抽象クラス Animal があり、そのサブクラス Dog と Cat の両方が、体重や年齢などの共通の属性を初期化する必要があるとします。次に、これらのプロパティを初期化するコンストラクターを Animal クラスに定義できます。

抽象クラス ファイル Animal.Java の内容は次のとおりです。

public abstract class Animal {
    private int weight;
    private int age;

    public Animal(int weight, int age) {
        this.weight = weight;
        this.age = age;
    }

    public int getWeight() {
        return weight;
    }

    public int getAge() {
        return age;
    }
}

このようにして、Dog と Cat は super キーワードを呼び出して親クラスのコンストラクターを呼び出し、基本プロパティの初期化を完了できます。

Dog.java ファイルの内容は次のとおりです。

// Dog类
public class Dog extends Animal {
    public Dog(int weight, int age) {
        super(weight, age);
        // 子类自己的初始化逻辑
    }
}

Cat.java ファイルの内容は次のとおりです。

// Cat类
public class Cat extends Animal {
    public Cat(int weight, int age) {
        super(weight, age);
        // 子类自己的初始化逻辑
    }
}

Animal クラスは抽象クラスとして設計されており、いくつかの基本的なプロパティとメソッドが含まれており、これらはサブクラスで継承および実装されることを説明します。構築メソッドはこれらのプロパティを初期化するために使用され、サブクラスで直接使用できます。

Test.java ファイルの内容は次のとおりです。

//调用测试
public class Test {
    public static void main(String[] args) {
        Dog dog = new Dog(5, 2);
        System.out.println("Dog's weight is " + dog.getWeight());
        System.out.println("Dog's age is " + dog.getAge());

        Cat cat = new Cat(3, 1);
        System.out.println("Cat's weight is " + cat.getWeight());
        System.out.println("Cat's age is " + cat.getAge());
    }
}

これは、サブクラスが親クラスのコンストラクターを呼び出すことによって基本プロパティの初期化を完了することを示しています。この例では、親クラス Animal のコンストラクターは public Animal(int Weight, int age) であり、サブクラスでは super(体重、年齢) 親クラスのコンストラクターを呼び出して、基本プロパティの初期化を完了します。

コンパイルと実行の出力は次のとおりです。

犬の体重は 5
犬の年齢は 2
猫の体重は 3
猫の年齢は 1

Java の抽象クラスはインスタンス化できないクラスであり、他のクラスの親クラスとしてのみ使用できます。抽象クラスは通常、クラスの基本フレームワークを定義するために使用され、特定の実装はそのサブクラスによって行われます。以下は、Javaの抽象クラスの主な特徴の一部です-

1. 抽象クラスはインスタンス化できません: 抽象クラスは構築メソッドを提供できますが、この構築メソッドを使用してオブジェクトを作成することはできません (オブジェクトを作成することに固執すると、コンパイル エラーが表示されます)。

2. 抽象クラスには、抽象メソッドと非抽象メソッドを含めることができます。抽象メソッドは、特定の実装を持たず、そのサブクラスによって実装する必要があるメソッドです。非抽象メソッドは、すでに特定の実装を持っており、抽象クラスで直接使用できます。

3. サブクラスはすべての抽象メソッドを実装する必要があります。サブクラスが抽象クラスを継承する場合、その抽象クラス内のすべての抽象メソッドを実装する必要があります。そうでない場合は、サブクラスも抽象クラスとして宣言する必要があります。

4. 構築メソッドおよびクラスメソッド(static で修飾されたメソッド)は、抽象メソッドとして宣言できません。

5. 抽象クラスはインターフェイスを実装できます。抽象クラスは複数のインターフェイスを実装でき、インターフェイスで定義されたメソッドのデフォルト実装を抽象クラスで提供できます。

6. 抽象クラスは継承可能: 抽象クラスは他のクラスに継承でき、継承されたサブクラスは抽象クラスで定義された非抽象メソッドを使用でき、その中のすべての抽象メソッドを実装する必要があります。

付録

https://www.cnblogs.com/c1024/p/11011996.html

https://www.cnblogs.com/weibanggang/p/11184671.html

おすすめ

転載: blog.csdn.net/cnds123/article/details/130618011