JavaSE - 抽象クラスとインターフェースの詳細な説明

ced485cbb11e458d81a746890b32cf3f.gif

作者:流川メイプルノックコード

ブログホームページ:流川楓のブログ

コラム:私と一緒にJavaを学ぼう

引用:ハングリーでいて、愚かでいて

良いことをしたいなら、まずツールを研ぎ澄ます必要があります.大手メーカーからのオファーを獲得するための超強力なツールを紹介しましょう-Niuke.com

クリックして無料で登録し、私と一緒に質問をブラッシングしてください  

目次

1.抽象クラス

1.1 抽象クラスについて

1.2 抽象クラスの特徴まとめ

1.3 抽象クラスの重要な役割

2.インターフェース

2.1 インターフェースを理解する方法は?

2.2 インターフェースの使用

2.3 インターフェース機能

2.4 複数のインターフェースの実装

2.5 インターフェース間の継承

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


1.抽象クラス

1.1 抽象クラスについて

概念: クラスが具体的なオブジェクトを記述するのに十分な情報を持っていない場合、そのクラスは抽象クラスです

構文: 抽象によって変更されたクラスは抽象クラスと呼ばれ、抽象クラスで抽象によって変更されたメソッドは抽象メソッドと呼ばれ、抽象メソッドは特定の実装本体を与える必要はありません。

フォーマット:

例: 

abstract class Shape{
    abstract public void draw();
    abstract void calcArea();
    
    public double getArea(){
        return area;
    }
    protected double area;
}

抽象メソッドには本体がありません

抽象クラスは、共通のメソッド、プロパティ、およびコンストラクターを追加することもできます

1.2 抽象クラスの特徴まとめ

1. 抽象クラスはインスタンス化できません

2.抽象メソッドはプライベートに変更できません

3. 抽象メソッドはサブクラスによって継承される必要があるため、final および static によって変更することはできません

エラー: 

修飾子の不正な組み合わせ: 'abstract' と 'final' 

修飾子の不正な組み合わせ: 'final' と 'abstract'

4. 抽象クラスは継承する必要があり、サブクラスは親クラスの抽象メソッドをオーバーライドする必要があります。そうでない場合、サブクラスも抽象クラスです。

abstract class Shape{
    abstract public void draw();
    abstract void calcArea();

    public double getArea(){
        return area;
    }
    protected double area;
}
class Circle extends Shape{
    private double r;
    final private static double PI = 3.14;

    public Circle(double r) {
        this.r = r;
    }

    @Override
    public void draw() {
        System.out.println("圆形:r"+r);
    }

    @Override
    void calcArea() {
        area = PI*r*r;
    }
    @Override
    public double getArea() {
        return super.getArea();
    }
}

5. 抽象クラスは必ずしも抽象メソッドを含むとは限らず、抽象メソッドを持つクラスは抽象クラスでなければなりません

6. サブクラスの抽象クラスには、オブジェクトの作成時に親クラスのメンバー変数を初期化するためのコンストラクターが存在する場合があります。

1.3 抽象クラスの重要な役割

クラスを継承した後、それが共通クラスであれば、メソッドをオーバーライドしなければエラーを報告しません.抽象クラスを継承すると、親クラスのメソッドをオーバーライドしなくてもエラーを報告します.コンパイラの検証を使用すると、非常に実際の開発に役立ちます。

2.インターフェース

2.1 インターフェースを理解する方法は?

インターフェイスは振る舞いの公的な標準であり、実装されれば、標準に準拠している限り、普遍的に使用することができます。

電子製品のUSB、電源ソケットなど

Java では、インターフェースは次のように見なすことができます: 複数のクラスの共通仕様、参照データ型

 文法:

インターフェイスの定義は、基本的にクラスの定義と同じです。キーワード: interface

1. インターフェースを作成する場合、インターフェースの名前は通常、大文字の I で始まります。

2. インターフェースの名前は、一般的に「形容詞」の品詞を使用します。

public interface Inter {
       //抽像方法
        void method();
}

2.2 インターフェースの使用

インターフェイスを直接使用することはできません。具体的なクラスを定義して、インターフェイスのすべての抽象メソッドを実装する必要があります

キーワード: 実装する

注: サブクラスと親クラスの間には extends の継承関係があり、クラスとインターフェイスの間には implement の実装関係があります。

フォーマット:

public class 类名称 implements 接口名称 {
        //...
}

2.3 インターフェース機能

1. インターフェイス タイプを直接インスタンス化することはできません。これは新しいオブジェクトです。

2. インターフェイスのメソッドは暗黙的にパブリック抽象として指定され、他の修飾子はエラーを報告します

 3. インターフェイスのメソッドは、インターフェイスを実装するクラスによって実装されます。

 4. インターフェイス内のメソッドを書き換える場合、デフォルトのアクセス許可の変更は使用できません

エラー: 'A' の 'openDevice()' は 'USB' の 'openDevice()' と競合しています; より弱いアクセス ('package-private') を割り当てようとしています; 'public'

5. インターフェイス内の変数は、public static final 変数として暗黙的に指定されます。

6. インターフェイスに静的コード ブロックとコンストラクターを含めることはできません

7. インターフェイスがコンパイルされると、バイトコード ファイルのサフィックス形式は .class になります。

8. クラスは、インターフェース内のすべての抽象メソッドを実装する必要があります。それ以外の場合、クラスは抽象クラスに設定する必要があります

 エラー: クラス 'A' は抽象として宣言するか、抽象メソッド 'USB()' を 'USB' に実装する必要があります

2.4 複数のインターフェースの実装

継承は単一継承ですが、クラスは複数のインターフェイスを実装できます

例を参照してください。

public class Test {
    public static void main(String[] args) {
        dragon drag = new dragon("dragon");
        drag.fly();
        drag.swim();
    }

}

//定义一个动物类
class Animal{
    protected String name;

    public Animal(String name){
        this.name = name;
    }
}
//定义接口

interface IFlying{
    void fly();
}

interface ISwimming{
    void swim();
}
//定义鸟类

class Bird extends Animal implements IFlying{
    public Bird(String name) {
        super(name);
    }

    @Override
    public void fly() {
        System.out.println(name+"正在用翅膀飞");
    }
}
//定义鱼类

class Fish extends Animal implements ISwimming {
    public Fish(String name) {
        super(name);
    }

    @Override
    public void swim() {
        System.out.println(name+"正在用尾巴游");
    }
}
//定义龙类

class dragon extends Animal implements ISwimming,IFlying{
    public dragon(String name) {
        super(name);
    }

    @Override
    public void fly() {
        System.out.println(name+"正在腾云驾雾");
    }

    @Override
    public void swim() {
        System.out.println(name+"正在海里游");
    }
}

 注: クラスが複数のインターフェイスを実装する場合は、すべての抽象メソッドを実装する必要があります。それ以外の場合は、抽象クラスに設定する必要があります

2.5 インターフェース間の継承

クラスとクラスは単一継承、インターフェースは複数継承可能

キーワード: 拡張

interface IAmphibious extends IFlying,ISwimming{
    @Override
    void fly();
    @Override
    void swim();
}
class dragon1 extends Animal implements IAmphibious{

    public dragon1(String name) {
        super(name);
    }
    @Override
    public void fly() {
        //...
    }
    @Override
    public void swim() {
        //...
    }
}

注: インターフェイス間の継承は、複数のインターフェイスをマージすることと同じです

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

コアの違い: 抽象クラスには共通のメソッドとフィールドを含めることができます。そのような共通のメソッドとフィールドはサブクラスで (オーバーライドせずに) 直接使用できますが、インターフェイスには共通のメソッドを含めることができず、サブクラスはすべての抽象メソッドをオーバーライドする必要があります。

抽象クラスの存在は、コンパイラがより適切に検証できるようにするためのものです❌

構文の違い:

1. 抽象クラスのメンバー変数は無制限であり、インターフェイスのメンバー変数は public static final 型のみにすることができます

2. 抽象クラスはメンバーメソッドの実装の詳細を提供でき、パブリック抽象メソッドのみがインターフェイスに存在できます

3. 抽象クラスには静的コード ブロックと静的メソッドを含めることができ、インターフェイスには静的コード ブロックと静的メソッドを含めることはできません。

4. クラスは 1 つの抽象クラスしか継承できませんが、クラスは複数のインターフェースを実装できます。

「この問題の共有はこちらです。ブロガーに 3 つのリンクを提供することを忘れないでください。あなたのサポートが私の創造の最大の原動力です!

ced485cbb11e458d81a746890b32cf3f.gif

 

おすすめ

転載: blog.csdn.net/chenchenchencl/article/details/126244071
おすすめ