接口和抽象类

以前一直不知道怎么直观的解释接口和抽象类的区别,今天看到一个通熟易懂的解释,和大家分享一下。

人的例子

假如有男人和女人两个类,男人和女人有很多相同的属性和动作,比如都会眨眼,都会睡觉。如果分开定义两个不相关的类,则会有很多重复的内容。因此我们可以为这两个类设计出一个更高级别的抽象类——人。可以把男人和女人不同的地方定义成抽象方法,分别在男女两个子类中实现,都具备的行为定义成实例方法。并且一个类只能继承一个抽象类(不可能既是生物又是非生物)。

对于接口,我们可以站着吃饭,坐着吃饭,用筷子吃饭,用勺子吃饭……那么可以把吃饭的动作抽象成一个接口——吃饭。并且一个类可以同时实现多个接口,比如驾驶接口,健身接口等等。

由于类的继承是单继承,当两个类没有共同的祖先类,比如老虎和鱼两个类,但是他们都有一个同样的方法(觅食)。这时想要它们使用同一个方法,定义一个觅食接口就是最好的选择。

总结

接口和抽象类都是继承树的上层,他们的共同点如下:

  1. 都是上层的抽象层。
  2. 都不能被实例化
  3. 都能包含抽象的方法,这些抽象的方法用于描述类具备的功能,但是不比提供具体的实现。
    他们的区别如下:
  4. 在抽象类中可以写非抽象的方法,从而避免在子类中重复书写他们,这样可以提高代码的复用性,这是抽象类的优势;接口中只能有抽象的方法。
  5. 一个类只能继承一个直接父类,这个父类可以是具体的类也可是抽象类;但是一个类可以实现多个接口。

一些注意点:

抽象类主要是用来抽象类别,接口主要是用来抽象方法功能。当你关注事物的本质的时候,请用抽象类;当你关注一种操作的时候,用接口。

接口里面只能对方法进行声明,抽象类既可以对方法进行声明也可以对方法进行实现。

抽象类里面的抽象方法必须全部被子类实现,如果子类不能全部实现,那么子类必须也是抽象类。接口里面的方法也必须全部被子类实现,如果子类不能实现那么子类必须是抽象类。

抽象类里面可以没有抽象方法。

抽象级别(从高到低):接口>抽象类>实现类。

posted @ 2018-12-27 17:24  xlupc  阅读(138)  评论(0编辑  收藏  举报