抽象类与接口

时间:2022-07-23
本文章向大家介绍抽象类与接口,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

# 抽象类

如果把一个方法定义为abstract,表示这是一个抽象方法,本身没有实现任何方法语句,因为这个抽象方法本身是无法执行的,所以其所在的类无法被实例化,必须要在类上也声明为abstract

无法实例化的抽象类有什么用?

抽象类本身被设计成只能用于被继承,因此,抽象类可以强迫子类实现其定义的抽象方法,否则编译器就会报错,因此,抽象方法实际上相当于定义了“规范”。

面向抽象编程

当我们定义了抽象类Person,其中有一个抽象的run()方法,当我们实现具体的StudentTeacher子类的时候,我们可以通过抽象类Person类型区引用具体子类的实例

abstract class Person{
    public abstract void run();
}

Person s = new Student();
Person t = new Teacher();

这种引用抽象类的好处在于,我们对其进行方法调用,并不关心Person类型变量的具体子类型:

// 不关心Person变量的具体子类型,在运行时能够根据它实际的子类型调用相应的方法
s.run();
t.run();

同样的代码,如果引用的是一个新的子类,我们仍然不关心具体类型:

// 同样不关心新的子类是如何实现run()方法的:
Person e = new Employee();
e.run();

这种尽量引用高层类型,避免引用实际子类型的方式,称之为面向抽象编程。

面向抽象编程的本质就是:

  • 上层代码只定义规范(例如:abstract class Person);
  • 不需要子类就可以实现业务逻辑(正常编译);
  • 具体的业务逻辑由不同的子类实现,调用者并不关心。

# 接口

如果一个抽象类没有字段,所有的方法都是抽象方法,那么就可以将抽象类改写为接口:interface

interface是比抽象类还要抽象的纯抽象接口,因为它连字段都不能有(可以有具体方法,用default修饰),因为接口定义的所有方法默认都是public abstract的,所以在定义接口时可以省略。

抽象类和接口的区别

  • 继承:一个类只能单继承一个抽象类,但可以实现多个接口
  • 字段:抽象类可以定义实例字段,而接口不行
  • 方法:抽象类可以定义非抽象方法,接口可以定义default方法(为了防止在接口中新增方法时影响其他已经实现了该接口的实现类报错[抽象方法必须被子类重写]而打的补丁)