09-抽象クラス、インターフェース、およびJavaの2つの違い


1.抽象クラス

概念

Javaでは、メソッド本体のないメソッドは抽象メソッドとして定義する必要があり、クラスに抽象メソッドがある場合は、クラスを抽象クラスとして定義する必要があります。

抽象クラスの特徴

  • 抽象クラスと抽象メソッドを使用する必要があります概要キーワードの変更
  • 抽象クラス形式:

抽象クラスクラス名{}

  • 抽象メソッド形式:

public abstract voidメソッド名();

  • 抽象クラスは必ずしも抽象メソッドを持っている必要はありません。抽象メソッドを持つクラスは抽象クラスでなければなりません。
  • 抽象クラスをインスタンス化することはできませんが、抽象クラスに構築メソッドが存在する可能性があります。目的は、サブクラスが親クラスのデータにアクセスするときに初期化することです。
  • 抽象クラスは直接インスタンス化することはできません。それらは、ポリモーフィックな方法で具象サブクラスによってインスタンス化されます。
  • 抽象クラスのサブクラス
    • 抽象クラスのいずれか
    • どちらのあなたは、抽象クラスのすべての抽象メソッドをオーバーライドする必要があります

例:抽象クラスの簡単な定義

//抽象类的定义
public abstract class Animals {
    
    
    String name;
    int age;
    //共性功能定义为抽象的,抽象类只需给出共性的声明即可
    // 具体的实现细节由子类根据自身的差异性,具体去重写
    public abstract void eat();
    public abstract void sleep();
    public void show(){
    
    
        System.out.println("抽象类内可以有非抽象方法");
    }
}
//子类继承该抽象类,必须重写抽象类中的抽象方法
public class Cat extends Animals {
    
    
    //抽象方法的重写,由子类依据自身特性具体实现
    @Override
    public void eat() {
    
    
        System.out.println("猫吃鱼");
    }

    @Override
    public void sleep() {
    
    
        System.out.println("猫睡沙发");

    }
    
}
public class Dog extends  Animals {
    
    
    @Override
    public void eat() {
    
    
        System.out.println("狗吃骨头");
    }

    @Override
    public void sleep() {
    
    
        System.out.println("狗睡地上");

    }
}

抽象クラスのメンバー特性

  • メンバー変数:変数または定数のいずれか
  • 構築方法:はい、親クラスのデータにアクセスするためのサブクラスの初期化に使用されます。
  • メンバーメソッド:抽象または非抽象にすることができます。

注意

抽象クラスのメンバーメソッドの特性:

  • 抽象メソッドはサブクラスに物事を強制します
  • 非抽象メソッドサブクラスの継承、コードの再利用性の向上

例:抽象クラスをインスタンス化する方法

public class Mytest {
    
    
    public static void main(String[] args) {
    
    
        //采用多态的形式创建父类引用,间接实例化父类
        Fu fu=new Zi();
        //多态中成员变量的访问特点:编译看左,运行看左
        System.out.println(fu.num);
        //多态中成员方法的访问特点:编译看左,运行看右
        fu.show();
        //向下转型,将父类引用强制转化成子类引用
        Zi zi=(Zi)fu;
        System.out.println(zi.num);
        zi.show();
    }
}
 abstract class Fu{
    
    
    int num=10;
    //抽象类不能直接实例化,但是有构造方法
    public Fu(){
    
    
        System.out.println("父类构造方法执行");
    }
    public abstract void show();

}
class Zi extends Fu{
    
    
    int num=20;
    public Zi(){
    
    
        System.out.println("子类构造方法执行");
    }

    @Override
    public void show() {
    
    
        System.out.println("子类show方法执行");
    }
}

演算結果:
ここに画像の説明を挿入

考え

  • クラスに抽象メソッドがない場合、抽象クラスとして定義できますか?

    はい、外の世界はそのようなオブジェクトを作成することはできません。これは、民営化されたクラスの構築方法に相当します。

  • 抽象化できないキーワードはどれですか?

    • final:矛盾する抽象的な必須サブクラスを書き換える必要があります。finalはサブクラスの書き換えを許可しません
    • プライベート:矛盾した抽象的によりサブクラスが書き換えられ、プライベートサブクラスは継承できず、書き換えることもできません
    • static:staticメソッドはクラスに属しているため、書き換えには関与せず、意味がありません

運動

要件:システムの開発時に従業員(Employee)クラスを設計する必要がある場合、employeeには、名前、ジョブ番号、および給与(salary)の3つの属性が含まれます。
マネージャーは従業員でもあります。従業員の属性に加えて、ボーナス属性もあります。次に、作業方法を定義します。
継承のアイデアを使用して、従業員クラスとマネージャークラスを設計してください。

//定义一个抽象类,将员工和经理的共性抽取出来,并声明一个抽象方法。
public abstract class person {
    
    
    public String name;
    public int num;
    public double salary;
    public abstract void workshow();
}

//员工类继承该抽象类,并依据自身的特性,实现抽象类中的抽象方法
public  class Employee extends person {
    
    
    @Override
    public void workshow() {
    
    
        System.out.println("员工一周工作七天");
    }
}
//经理继承该抽象类,并重写抽象方法。声明额外属性bouns
public class Manager extends person{
    
    
    public double bouns;
    @Override
    public void workshow() {
    
    
        System.out.println("经理一周工作5天");
    }
}
//测试类
public class Mytest {
    
    
    public static void main(String[] args) {
    
    
        //使用多态的方式,创建对象
        person p=new Employee();
        p.name="小明";
        p.num=224075;
        p.salary=3500;
        System.out.println("员工名字:"+p.name+";职工号:"+p.num+";月薪:"+p.salary);
        //多态中成员方法的访问特点:编译看左,运行看右
        p.workshow();
        System.out.println("====================================================");
        person p1=new Manager();
        p1.name="赵建国";
        p1.num=1;
        p1.salary=7500;
        //向下转型,才能调用子类中的特有属性
        ((Manager) p1).bouns=800;
        System.out.println("经理名字:" + p1.name + ";职工号:" + p1.num + ";月薪:" + p1.salary+";奖金:"+((Manager) p1).bouns);
        p1.workshow();
    }
}

演算結果:
ここに画像の説明を挿入

2.インターフェース

概念

物事の拡張性を反映するために、Javaはこれらの追加関数を定義するためのインターフェースを提供し、特定の実装を提供しません。これらの追加関数をいくつかの特定のオブジェクトに引き渡すだけで十分です。

インターフェースの特徴

  • インターフェイスのキーワード インターフェース フォーマット:

インターフェイスインターフェイス名{}

  • クラス実装インターフェースは、実装フォーマットを使用します。

クラスクラス名はインターフェース名を実装します{}

  • インターフェイスを直接インスタンス化することはできません。ポリモーフィックな方法でインスタンス化する必要があります
  • インターフェイスサブクラス
    • 抽象クラスにすることもできますが、意味はほとんどありません。
    • 具体的なクラスにすることができます。インターフェイスのすべての抽象メソッドを書き換えます。

インターフェースメンバーの特徴

  • メンバー変数:定数および静的のみにすることができます。デフォルトの修飾子:public static final(手動で指定することをお勧めします)
  • 構築方法:インターフェースには構築方法がありません
  • メンバーメソッド:抽象メソッドのみ、デフォルトの修飾子:パブリック抽象(手動で指定することをお勧めします)

例:インターフェースの簡単な定義と実装

//定义一个接口,接口中定义的都是一些扩展功能,哪类事物需要具备该扩展功能,就需要实现该接口。
public interface Myinterface {
    
    
    public static final int num=1000;//默认修饰符:public static final
    public abstract  void calc();//默认修饰符:public abstract
}
//子类实现父接口,必须重写接口中的所有抽象方法
public class person implements Myinterface {
    
    
    @Override
    public void calc() {
    
    
        System.out.println("人会算数");
    }
    public void love(){
    
    
        System.out.println("人有情感");
    }
}
public class dog implements Myinterface {
    
    
    @Override
    public void calc() {
    
    
        System.out.println("狗经过后天训练,也会算数");
    }
    public void watchdoor(){
    
    
        System.out.println("狗会看家");
    }
}
//使用多态的形式,创建对象。
public class mytest {
    
    
    public static void main(String[] args) {
    
    
        //接口不能创建对象,子类和接口之间是实现关系,可以叫父接口,子类
        //采用多态的形式
        Myinterface myinterface=new person();
        myinterface.calc();
        System.out.println(myinterface.num);
        //想要调用子类中独有的方法,需向下转型
        person p=(person)myinterface;
        p.love();
        System.out.println(p.num);
        System.out.println("=====================================");
        Myinterface myinterface1 = new dog();
        myinterface1.calc();
        System.out.println(myinterface1.num);
        dog d=(dog)myinterface1;
        d.watchdoor();
        System.out.println(d.num);

    }
}

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

  • メンバーシップの違い

    • 抽象クラス

      • メンバー変数:変数または定数にすることができます
      • 工法:あり
      • メンバーメソッド:抽象または非抽象にすることができます
    • インターフェース

      • メンバー変数:デフォルトで変更されたパブリック静的定数である必要がありますpublic static final
      • メンバーメソッド:JDK1.8以降は抽象メソッドのみを定義できます。デフォルトの変更メソッドを定義できます。関数の特定の実装を指定できます。サブクラスを継承して使用できます。JDK1.8以降、静的メソッドもで定義できます。インターフェース。
  • 関係の違い

    • クラスとクラス

      • 継承、単一継承、多重継承
    • クラスとインターフェース

      • 実現、単一実現、複数実現
    • インターフェイスとインターフェイス

      • 継承、単一継承、多重継承
  • デザインコンセプトの違い

    • 継承された抽象クラスは「isa」の関係を反映しており、抽象クラスで定義されているのは継承システムの共通機能です。
    • インターフェイスは「likea」の関係を反映するように実装されており、インターフェイスで定義されているのは継承システムの拡張機能です。

おすすめ

転載: blog.csdn.net/m0_46988935/article/details/110522946