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

© 资建文 中级黑马   /  2012-8-20 23:56  /  2054 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

接口和抽象类有什么区别?我们选择接口和抽象类的时候依据是什么?

评分

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

查看全部评分

3 个回复

倒序浏览
这个问题在csdn博客上有篇,刚好我也收藏了。我专业的考试题。
原文地址:http://blog.csdn.net/fenglibing/article/details/2745123
接口和抽象类的概念不一样。接口是对动作的抽象,抽象类是对根源的抽象。

抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什么。比如,男人,女人,这两个类(如果是类的话……),他们的抽象类是人。说明,他们都是人。

人可以吃东西,狗也可以吃东西,你可以把“吃东西”定义成一个接口,然后让这些类去实现它.

所以,在高级语言上,一个类只能继承一个类(抽象类)(正如人不可能同时是生物和非生物),但是可以实现多个接口(吃饭接口、走路接口)。

第一点. 接口是抽象类的变体,接口中所有的方法都是抽象的。而抽象类是声明方法的存在而不去实现它的类。
第二点. 接口可以继承,抽象类不行
第三点. 接口定义方法,不能实现,而抽象类可以实现部分方法。
第四点. 接口中基本数据类型为static 而抽类象不是的。

当你关注一个事物的本质的时候,用抽象类;当你关注一个操作的时候,用接口。



接口可以实现也可以继承,抽象类不行

抽象类的功能要远超过接口,但是,定义抽象类的代价高。因为高级语言来说(从实际设计上来说也是)每个类只能继承一个类。在这个类中,你必须继承或编写出其所有子类的

所有共性。虽然接口在功能上会弱化许多,但是它只是针对一个动作的描述。而且你可以在一个类中同时实现多个接口。在设计阶段会降低难度的。

评分

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

查看全部评分

回复 使用道具 举报
接口的特点:
(1)接口是对外暴露的规则。例如:CPU的插槽
(2)接口是程序的功能扩展。预留多个USB接口,插座.
(3)接口的出现降低耦合性。
  耦合:类与类之间的关系.(比如依赖关系)
  内聚:类完成功能的能力.
  编程规范:低耦合,高内聚.
(4)接口可以用来多实现。
(5)类与接口之间是实现关系,而且类可以继承一个类的同时实现多个接口。
(6)接口与接口之间可以有继承关系。
抽象类的特点:
(1)抽象类和抽象方法必须用abstract关键字来修饰。
(2)抽象方法只有方法声明,没有方法体,定义在抽象类中。
(3)抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类.
(4)抽象类不可以被实例化,也就是不可以用new创建对象。原因如下:
  抽象类是具体事物抽取出来的,本身是不具体的,没有对应的实例。
  例如:犬科是一个抽象的概念,真正存在的是狼和狗。
  而且抽象类即使创建了对象,调用抽象方法也没有意义。
(5):抽象类通过其子类实例化,而子类需要覆盖掉抽象类中所有的抽象方法后才可以创建对象,
     否则该子类也要定义为抽象类。

接口和抽象类的区别:
(1):抽象类只能被单继承,接口可以多实现
(2):抽象类中的数据特点:
  成员变量:可以使变量,也可以是常量
  成员方法:可以是抽象方法,也可以是非抽象方法.
  构造方法:有构造方法.
     接口中的数据特点:
  成员变量:是常量.都是默认修饰public static final
  成员方法:都是抽象方法,都是默认修饰public abstract
  无构造方法
(3)接口的出现避免了多继承的局限性.
(4)抽象类中定义的是体系中的共性功能.
    接口中定义的是体系中的扩展功能.
(5)抽象类被继承是"is a"关系:xx是yy的一种.
    接口被实现是"like a"关系:xx像yy的一种.

当你要某个类的功能时使用继承.  如果你要想扩展某个功能就使用接口 .

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
abstract class和interface在Java语言中都是用来进行抽象类定义的
(1)  在abstract class方式中,Demo可以有自己的数据成员,也可以有非 abstract的成员方法,而在interface方式的实现中,
    Demo只能够有静态的不能被修改的数据成员(也就是必须是static final 的,不过在interface中一般不定义数据成员),
    所有的成员方法都是abstract的。从某种意义上说,interface是一种特殊形式的 abstract class。
(2)abstract class 在 Java 语言中表示的是一种继承关系(extends),一个类只能使用一次继承关系因为Java不支持多继承。
    而interface在java中通过实现来完成(implements),可以实现多个接口,弥补了java单继承的缺点
(3) 在abstract class的定义中,我们可以赋予方法的默认行为。但是在interface的定义中,方法却不能拥有默认行为,
   为了绕过这个限制,必须使用委托,但是这会增加一些复杂性,有时会造成很大的麻烦。
(4)  在实际运用中我们可以定义一个接口,通过这个接口连接到主函数,只要以后新定义的功能按照这个接口去设计
    那么就不需要改动主函数也能调用这个果功能
    这就像我们电脑一样,电脑上有很多接口,我们刚买电脑时可能功能很单一,以后如果想升级增加功能就可以
    把买来的升级工具插在接口上就能运行了,因为这些东西都是按照一样的接口生产的,这样就大大的方便了我们的使用!
    而且增加了我们系统的安全性


简单说就是:
1. abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。
  但是,一个类却可以实现多个interface。

2.  在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,
   只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在 interface中一般不定义数据成员),
   所有的成员方法都是abstract的。

3.  abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系。

4.  实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。

5.  接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。

6.  抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。

7.  接口中的方法默认都是 public,abstract 类型的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马