抽象类和接口是支持抽象定义的两种机制。两者具有很大的相似性,同时也存在很大的区别。
抽象类
什么是抽象方法
在了解抽象类之前先了解一下什么是抽象方法。
抽象方法就是被 abstract
关键字修饰的方法,这种方法只有方法名、参数列表和返回值类型,没有方法体,如下
abstract void setName(String name);
abstract String getName();
抽象方法默认的权限访问修饰符为 public
public abstract void show();
什么是抽象类
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
比如,在一个图形编辑软件的分析设计过程中,就会发现问题领域存在着圆、三角形这样一些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域并不是直接存在的,它就是一个抽象概念。而正是因为抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的。
抽象类的一些特点
- 抽象类被
abstract
关键字修饰。 - 抽象类可以包含 0 个 1 个 或者多个抽象方法。
- 抽象类不能够实例化。
- 一个类继承抽象类必须实现所有抽象方法,除非该类也是抽象类
除了这些特殊之处,和普通类一样
- 可以有成员变量
- 可以有构造方法
- 可以有普通方法
- 可以继承抽象类
- 可以继承普通类
- 可以实现一个或多个接口
抽象类使用场景
abstract class
的应用场合
一句话,在既需要统一的接口,又需要实例变量或缺省的方法的情况下,就可以使用它。最常见的有:
- 定义了一组接口,但又不想强迫每个实现类都必须实现所有的接口。可以用abstract class定义一组方法体,甚至可以是空方法体,然后由子类选择自己所感兴趣的方法来覆盖。
- 某些场合下,只靠纯粹的接口不能满足类与类之间的协调,还必需类中表示状态的变量来区别不同的关系。abstract的中介作用可以很好地满足这一点。
- 规范了一组相互协调的方法,其中一些方法是共同的,与状态无关的,可以共享的,无需子类分别实现;而另一些方法却需要各个子类根据自己特定的状态来实现特定的功能
什么是接口
接口的使用场景
我们一开始使用的的接口,后来实现的子类里有些子类有共同属性,或者相同的方法实现,所以提取出来一个抽象类,作为类和接口的中介。接口是设计的结果,而抽象类是重构的结果。
两者的区别和联系
抽象类和接口都不能直接实例化。如果要实例化,涉及到多态。抽象类要实例化,抽象类定义的变量必须指向一个子类对象,这个子类继承并实现了抽象类所有的抽象方法。接口要实例化,接口定义的变量必须指向一个子类对象,这个子类继承并实现了接口所有的方法。
抽象类要被子类继承,接口要被子类实现。
抽象类里既可以有抽象方法,也可以有方法实现;接口只能有抽象方法。
抽象类里面的抽象方法必须被子类实现,如果子类不能全部实现,子类必须也是抽象类。接口里面的方法必须被子类实现,如果子类不能全部实现,子类必须是抽象类。
接口里面的方法不能有具体的实现,这说明接口是设计的结果,而抽象类是重构的结果。
抽象类里面可以没有抽象方法,如果一个类里面有抽象方法,那么这个类一定是抽象类。
抽象类中的抽象方法都要被实现,所以抽象方法不能是静态的static,也不能是私有的private。
接口可以继承多个接口;类可以实现多个接口,但是只能继承一个类。
抽象类主要用来抽象类别,接口主要用来抽象方法功能。关注事物的本质,用抽象类;关注一种操作,用接口。
参考资料
https://blog.youkuaiyun.com/qq_33666932/article/details/79371603
https://blog.youkuaiyun.com/sugesi/article/details/55253277
https://blog.youkuaiyun.com/frankfan123/article/details/79628034
https://blog.youkuaiyun.com/xiaoliuliu2050/article/details/61931498