抽象类和接口

前言

面试过程中经常问道这个问题,抽象类和接口之间的区别在哪里,即使我们会使用他们,但是如果没有进行系统以及深入的思考的话,我们可能还是无法很好的回答这个问题,于是我查阅了网上的一些博客,结合自己的一些感受,在这里进行一下总结和回答.

抽象类

如果一个类没有足够的信息来描述一个具体的对象,那么这个类就是一个抽象类. 抽象类作为一个类,他具有其他类所有的特点: 可以有构造函数, 可以有成员函数和变量, 可以有非抽象的方法,可以被继承等等,然而也具有自己的一些"特色": 因为抽象类缺乏足够的信息,所以如果我们需要使用抽象类来创建一个对象,那么我们需要提前实现抽象类中的抽象方法.

接口

接口在Java中是一个抽象类型,是抽象方法的集合。一个类通过继承接口的方式,从而继承接口的抽象方法。 如此说来,接口并不是一个类,所以它不能有类有的构造函数,没有默认实现的方法,只能有抽象方法,变量也只能是静态(static)和常量(final),不能像类一样被继承,只能被实现(implements),一旦我们实现了一个接口,我们需要实现其中所有的方法.

区别

抽象类和接口的区别实际上就是类和接口的区别,而除掉一些显而易见的区别(接口没有构造函数,接口没有类默认实现的函数...),可能需要注意的是一下几点:

  1. 抽象类的方法可以有public,protected,private修饰,而接口的方法只能由public来修饰
  2. 由于Java不是多继承,一个类只能继承一个类,而能实现多个接口,这对抽象类和接口在编程上的使用有着极大的影响.例如后面会探讨的"面对'接口'的编程"
  3. 抽象方法会比接口速度快,因为接口需要在类中寻找实现的方法(其他博客上看到的,未做验证)
  4. 当你实现一个接口的时候,你需要实现接口中的全部抽象方法,这也意味着如果你后期增加了一个接口中的方法,你需要在所有的实现了这个接口的子类中全部实现一次新增的抽象方法

思考

实际上,上述的内容仅仅是在知识层面进行了回顾,为什么我们需要知道抽象类和接口的区别? 在实际运用上,这些区别会对我们编写代码带来什么影响?

面向"接口"的编程

之所以需要使用抽象类和接口,是因为我们日常编程中,最好面向"接口"进行编程,此处的"接口"并非上述Java语言中的interface接口,而是一种抽象的规范, 这种思想的目的是为了解耦合,也就是减少代码的"逻辑重复",可以让一份代码多人分工协作,并且极大的提高了代码的可读性,可写性以及可靠性. 就例如,我们要写一本书,那么我们可以先定一个大纲(目录),如此一来,我们这本书大概的内容就有了,我们也可以分别请多个人来完善不同章节的内容,此处的"大纲(目录)"就可以认为是"接口". 回归正题,抽象类和接口的使用正是为了让我们更好的采取面向"接口"的编程,而为了说明这两者之间的区别对编程上不同的影响,我们可能得引入两个个设计模式:"工厂模式"和"抽象工厂模式"

工厂模式和抽象工厂模式

我们目前已经明白了抽象类和接口大概的目的和意义,我们来探讨一下实际的运用.

工厂模式

我们一般是创建一个抽象类, 然后通过子类来继承该抽象类,实现其中创建对象的方法,如此一来,我们就可以复用抽象类中默认实现的函数,又能让子类来动态的创建对象. 举一个例子: 客户需要点单一个pizza,点单pizza的过程需要经过:1) 创建pizza 2) 准备原料 3) 烘焙 4) 切片 5)装盒 然而pizza的品种有很多种,如果我们将不同品味的pizza对象的创建都写死在代码中的话,代码的灵活性就大大降低了. 又因为除了pizza的口味不同,后面的步骤是基本相同的,也就是说后面的2 3 4 5步函数是可以复用的, 那么我们就可以将 "创建pizza"函数声明为抽象的(abstract),让不同的子类来实现,从而实现不同口味pizza的创建

抽象工厂模式

通过定义接口,由不同的实现类来实现接口实现不同的函数,而由于每个实现类实现接口的方式不一样,所以我们可以创建不一样口味的pizza,然而抽象方法都被接口限定了,所以我们可以很轻松的使用多态,来调用不同实现类的方法,从而动态的创建不同的pizza.

总结

由于抽象类与接口的区别,对我们编程的影响主要是:使用抽象类是为了代码的复用,而使用接口是为了实现多态性.

转载于:https://juejin.im/post/5b02e5216fb9a07a9b3644bc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值