黑马程序员技术交流社区
标题:
接口和抽象类有什么区别啊?
[打印本页]
作者:
资建文
时间:
2012-8-20 23:56
标题:
接口和抽象类有什么区别啊?
接口和抽象类有什么区别?我们选择接口和抽象类的时候依据是什么?
作者:
张文
时间:
2012-8-21 00:36
这个问题在csdn博客上有篇,刚好我也收藏了。我专业的考试题。
原文地址:http://blog.csdn.net/fenglibing/article/details/2745123
接口和抽象类的概念不一样。接口是对动作的抽象,抽象类是对根源的抽象。
抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什么。比如,男人,女人,这两个类(如果是类的话……),他们的抽象类是人。说明,他们都是人。
人可以吃东西,狗也可以吃东西,你可以把“吃东西”定义成一个接口,然后让这些类去实现它.
所以,在高级语言上,一个类只能继承一个类(抽象类)(正如人不可能同时是生物和非生物),但是可以实现多个接口(吃饭接口、走路接口)。
第一点. 接口是抽象类的变体,接口中所有的方法都是抽象的。而抽象类是声明方法的存在而不去实现它的类。
第二点. 接口可以继承,抽象类不行
第三点. 接口定义方法,不能实现,而抽象类可以实现部分方法。
第四点. 接口中基本数据类型为static 而抽类象不是的。
当你关注一个事物的本质的时候,用抽象类;当你关注一个操作的时候,用接口。
接口可以实现也可以继承,抽象类不行
抽象类的功能要远超过接口,但是,定义抽象类的代价高。因为高级语言来说(从实际设计上来说也是)每个类只能继承一个类。在这个类中,你必须继承或编写出其所有子类的
所有共性。虽然接口在功能上会弱化许多,但是它只是针对一个动作的描述。而且你可以在一个类中同时实现多个接口。在设计阶段会降低难度的。
作者:
王广彬
时间:
2012-8-21 00:38
接口的特点:
(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的一种.
当你要某个类的功能时使用继承. 如果你要想扩展某个功能就使用接口 .
作者:
吴通
时间:
2012-8-22 21:38
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 类型的。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2