A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© homeless 中级黑马   /  2014-3-1 12:13  /  1350 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

抽象类里定义了0个或多个抽象方法,接口里的方法也全都是抽象的,最大区别是一个是extends,一个是implements那么究竟该什么时候用抽象类,什么时候用接口。假若被面试问道了,又该怎么回答呢?

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

6 个回复

倒序浏览
接口可以多实现,抽象类只能单继承,抽象类可以对方法进行部分实现,只实现共有的方法,二实现方式不同的方法交个子类,也就是说抽象类不打算解决所有的问题,只解决部分公有的问题。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
抽象类只能单继承,接口可以多实现。
接口的方法都是 public abstract 的,成员变量是 public static final 的。

用到抽象类,说明抽象类一定是一个父类。
用到接口,只是说明有一定的关系,就像用到序列化接口的时候,只是为了给类加上一个标记而已。

接口的出现是为弥补java中没有多重继承的遗憾。比如,当你有个Animal父类,然后你又想要Dog这个子类拥有Pet的特性,这是就可以将Pet设计为接口了。

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 陪你等日出 于 2014-3-1 14:23 编辑

以前我也有和楼主同样的困惑,觉得抽象类和接口区别不大,有时都可以用,后来看了很多讲解弄懂了。
首先,抽象类在java语言中表现的是一种继承关系,而且只能单继承,就意味着一个类只能使用一次继承关系,但是一个类却可以实现多个接口。然后,抽象类表示的是“is a”关系,接口表示的是“like a”关系。
那么决定使用接口还是使用抽象类就看你对问题领域的理解,你的设计意图是怎样的,举一个例子:
你要设计一个phone,这个phone中有两个功能:call,send,那么你可以这样设计
用抽象类定义:
  1. abstract class phone
  2. {
  3.         abstract void call();
  4.         abstract void send();
  5. }
复制代码

用接口定义:
  1. interface phone
  2. {
  3.         void call();
  4.         void send();
  5. }
复制代码

然后其它具体的phone对象可以通过继承抽象类phone,使用其中的方法,或者通过实现phone接口再使用其中的方法,这么看来区别不大,但是这时如果你想让这个手机不仅可以发送短信和打电话,还要拥有照相功能,那么你可以这样做:
抽象类中简单的加上拍照方法,让其成为拍照手机:
  1. abstract class phone
  2. {
  3.         abstract void call();
  4.         abstract void send();
  5.         abstract void camera();
  6. }
复制代码

接口中简单的加上拍照方法,让其成为拍照手机:
  1. interface phone
  2. {
  3.         void call();
  4.         void send();
  5.         void camera();
  6. }
复制代码

看起来是实现了功能要求,但是却违反了面向对象设计的一个核心原则ISP (Interface Segregation Principle),因为你将phone概念固有的功能和照相机的行为方法混在一起了。那么这里就是前面所说的,决定使用接口还是使用抽象类就看你对问题领域的理解,你的设计意图是怎样的,显然你要设计的是一个手机,那么就要这样设计:
  1. abstract class phone
  2. {
  3.         abstract void call();
  4.         abstract void send();
  5. }
  6. interface Camera
  7. {
  8.         void camera();
  9. }
  10. //继承固有功能,实现照相功能
  11. class CameraPhone extends phone implements Camera
  12. {
  13.         void call()
  14.         {
  15.                 System.out.println("call phone");
  16.         }
  17.         void send()
  18.         {
  19.                 System.out.println("send message");
  20.         }
  21.         void camera()
  22.         {
  23.                 System.out.println("take photos");
  24.         }
  25. }
复制代码

如果你想设计一个可以发送短信和打电话的照相机,那么你可以把上面的设计方式反过来,把camera()定义在抽象类里,把send()和call()定义在接口里。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
午夜b'Boy 来自手机 中级黑马 2014-3-1 16:07:18
报纸
设计一个类,共性的,最本质的,一般用抽象类实现,特别的,扩展的,相互约定的一般用接口实现
回复 使用道具 举报
抽象类,使部分抽象,它是可以带有一些有方法体的方法的。接口中的所有方法都是抽象的。抽象类是模板,接口是规范。
回复 使用道具 举报

当描述一组方法的时候 或 有一些变量和方法,你不需要修改的时候使用接口
当描述一个虚拟的物体的时候使用抽象类
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马