抽象类和接口

1. 引言

接口和抽象类是面向对象编程中的两个概念,用于实现代码的抽象和封装。

2. 抽象类

2.1 定义

抽象类(Abstract Class)是用于实现部分行为的类,它不能被实例化。抽象类可以包含普通方法、抽象方法(只有方法签名,没有具体实现)和属性,但抽象类中的抽象方法必须在子类中被实现。抽象类可以作为其他类的基类,其他类可以通过继承抽象类获得其属性和方法。在Java中,抽象类通过abstract关键字来定义。

2.2 抽象方法

抽象方法是一种特殊的方法,它没有方法的具体实现,即没有方法体,定义该方法时要用abstract关键字来修饰,该方法必须在抽象类中。

public abstract void run();

2.3 抽象类的特性

  • 使用abstract关键字来修饰抽象类。
  • 抽象类不能被实例化,即不能用抽象类去创建对象。
  • 抽象类中可以有普通类中所包含的成员变量,成员方法和构造方法。
  • 抽象类相比于普通类,抽象类中有抽象方法。
  • 抽象类的方法不能被private修饰的,不然违背重写原则。
  • 抽象类中有构造方法,为了方便子类能够调用,来初始化抽象类当中的成员。
  • 类只能通过extends关键字去继承抽象类。

2.4 抽象类的使用

  • Animals抽象类
public abstract class Animals {
    int leg; //腿

    public Animals() {
    }

    public Animals(int leg) {
        this.leg = leg;
    }

    public abstract void run();
}
  • Dog类继承Animals抽象类
public class Dog extends Animals{
    public Dog() {
        super(4);
    }
    @Override
    public void run() {
        System.out.println("狗在跑");
    }
}
  • Duck类继承Animals抽象类
public class Duck extends Animals{
    public Duck(){
        super(2);
    }
    @Override
    public void run() {
        System.out.println("鸭子在跑");
    }
}
  • 测试类:
public class TestAnimals {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.run();
        System.out.println("狗的腿有" + dog.leg + "条");

        Duck duck = new Duck();
        duck.run();
        System.out.println("鸭子的腿有" + duck.leg + "条");
    }
}

测试结果如下:

3. 接口

3.1 定义

接口(Interface)是一种抽象类型,它定义了一组方法的签名,但没有具体的实现。接口描述了一个类或者对象应该具备的行为,实现了接口的类必须实现接口中定义的所有方法。接口提供了一种规范,确保了代码的一致性和层次结构的灵活性。通俗来讲,接口就是一个标准,实现接口的类都得按照这个标准来定义。在Java中,接口通过interface关键字来定义。

3.2 接口存在的意义

类的父类只能有一个,继承只能是单继承,可以使用接口让我们实现多继承的逻辑。

3.3 接口的特性

  • 使用interface关键字来修饰接口。
  • 接口是特殊的抽象类。
  • 接口中的方法不能不能有具体的实现。
  • 接口中的方法可以是抽象的,静态的,默认的。在接口中抽象方法默认是 public abstract修饰的。在接口中变量默认是 public static final修饰的,实现它的类重写接口中的方法必须由public修饰。
  • 接口不能被实例化,即接口不能有构造方法。
  • 使用implements关键字来实现接口,接口里面的抽象方法必须要重写,默认方法可以重写也可以不重写,静态方法不能被重写。
  • 多个类可以实现一个接口。一个类可以实现多个接口,但只能继承一个类。
  • 类实现接口的时候,必须要实现接口里面的所有方法。否则,该类要定义为抽象类。

3.4 接口的使用

  • ICharger接口:开始充电和停止充电两个方法
public interface ICharger {
    void startCharge();
    void stopCharge();
}
  • Huawei类:实现ICharger接口
public class Huawei implements ICharger{
    @Override
    public void startCharge() {
        System.out.println("华为手机开始充电");
    }

    @Override
    public void stopCharge() {
        System.out.println("华为手机停止充电");
    }
}
  • Honor类:实现ICharger接口
public class Honor implements ICharger{
    @Override
    public void startCharge() {
        System.out.println("荣耀手机开始充电");
    }

    @Override
    public void stopCharge() {
        System.out.println("荣耀手机停止充电");
    }
}
  • 测试类:
public class TestCharger {
    public static void main(String[] args) {
        Huawei huawei = new Huawei();
        huawei.startCharge();
        huawei.stopCharge();

        Honor honor = new Honor();
        honor.startCharge();
        honor.stopCharge();
    }
}

测试结果如下:

4. 区别和联系

4.1 区别

  • 抽象类中可以含有普通方法和成员变量,接口中不能含有普通方法,子类必须重写所有抽象方法。
  • 抽象类用extends关键字继承,接口用implements关键字实现。
  • 一个抽象类可以实现多个接口,接口不能继承抽象类,接口可以使用extends关键字继承多个父类接口。
  • 一个类只能继承一个抽象类,一个类可以实现多个接口。
  • 接口适用于描述类之间的公共行为和功能,它提供了规范和约束,实现接口能够在不同的类之间实现代码的复用和组合。抽象类适用于描述类之间的共同特征和行为,它提供了一些通用的方法和属性,子类可以通过继承和重写来实现具体的功能。

4.2 联系

抽象类和接口中都可以由抽象方法,抽象方法是没有方法体的,这就需要我们去继承抽象类或者实现接口时来重写这些方法。

5.  总结

  • 抽象类中不一定有抽象方法,,但有抽象方法的类一定是抽象类。
  • 有了接口之后,类的使用者就不用关注具体类型,而只关注某个类是否具备某种能力。
  • 接口和抽象类都是面向对象编程中的重要概念,用于实现代码的抽象和封装,提高代码的可维护性和可扩展性。选择使用接口还是抽象类,取决于具体的需求和设计考虑。

 

posted @ 2023-09-30 15:10  小强不砍树  阅读(61)  评论(0编辑  收藏  举报