abstract class 和 interface的比较
2016-07-21 18:31
295 查看
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.abstract class是另一种契约形式,是设计对实现的要求;而接口是服务器对客户端的要求。
6.abstract class是一个基类,不能被实例化;接口是个声明,每个对应接口的类都要实现方法。
7. 一个子类如果implements一个接口,就必须实现接口中的所有方法(不管是否需要);如果是继承一个抽象类,只需要实现需要的方法
即可,这是抽象类的一个优点
8. 如果一个接口中定义的方法名改变了,那么所有实现此接口的子类显然将无法通过编译,因为它们所实现的方法名已经不存在了,这是
接口的一个缺点;而抽象类中如果有个非抽象方法改了,就不存在这个问题,只是为子类添加了一个新的方法。
9. 看前面两点,似乎抽象类要比接口有着更多的优点,但它却有着一个难以弥补的缺点:就是一个子类只能有一个父类。A extends B 。
这样A就拥有了B的所有方法和功能,但当A还想拥有C的功能的时候。就不能通过 A extends C 来实现,而需要走一些弯路。目前系统架构
的趋势就是由针对抽象(借口,抽象类)而不是具体编程,并且将功能尽可能的细分。这就需要通过实现多个接口的方式来实现,显然,抽
象类无法提供这样的功能。从系统重构的角度来说,一个具体类抽象出接口是十分方便的。只需要写一个接口,里面定义具体类的所有方法,
然后在为这个具体类implement这个接口就可以了。而抽象类就要复杂的多,比如说 B extends A , C extends B 如果想要为c抽象出一个抽象
类D的话,就需要找到它的最顶层A来从头做起,因为无法做到C extends D
参考:http://www.cnblogs.com/bluestorm/archive/2012/03/02/2377326.html
2.在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据
成员(也就是必须是static final的,不过在 interface中一般不定义数据成员),所有的成员方法都是abstract的。
3.abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系,
interface表示的是"like-a"关系。
4.接口一般用于在抽象类中没有可供继承的默认实现时(即没有实例变量和默认方法实现)代替该类。
5.abstract class是另一种契约形式,是设计对实现的要求;而接口是服务器对客户端的要求。
6.abstract class是一个基类,不能被实例化;接口是个声明,每个对应接口的类都要实现方法。
7. 一个子类如果implements一个接口,就必须实现接口中的所有方法(不管是否需要);如果是继承一个抽象类,只需要实现需要的方法
即可,这是抽象类的一个优点
8. 如果一个接口中定义的方法名改变了,那么所有实现此接口的子类显然将无法通过编译,因为它们所实现的方法名已经不存在了,这是
接口的一个缺点;而抽象类中如果有个非抽象方法改了,就不存在这个问题,只是为子类添加了一个新的方法。
9. 看前面两点,似乎抽象类要比接口有着更多的优点,但它却有着一个难以弥补的缺点:就是一个子类只能有一个父类。A extends B 。
这样A就拥有了B的所有方法和功能,但当A还想拥有C的功能的时候。就不能通过 A extends C 来实现,而需要走一些弯路。目前系统架构
的趋势就是由针对抽象(借口,抽象类)而不是具体编程,并且将功能尽可能的细分。这就需要通过实现多个接口的方式来实现,显然,抽
象类无法提供这样的功能。从系统重构的角度来说,一个具体类抽象出接口是十分方便的。只需要写一个接口,里面定义具体类的所有方法,
然后在为这个具体类implement这个接口就可以了。而抽象类就要复杂的多,比如说 B extends A , C extends B 如果想要为c抽象出一个抽象
类D的话,就需要找到它的最顶层A来从头做起,因为无法做到C extends D
参考:http://www.cnblogs.com/bluestorm/archive/2012/03/02/2377326.html
相关文章推荐
- 在webstorm中用代码将图片随机显示出来
- Redis学习笔记四——redis安全设置
- morgan模块格式扩展
- oracle 存储过程
- Linux下安装Apache Openssl
- RelativeLayout 属性含义
- HDU 5744 Keep On Movin(思维【多校联合】)
- The Suspects
- iOS开发中如遇到频繁的Http请求,如何取消之前已经发送的Http请求?
- 【转载】dts介绍
- css简介及相关概念
- 系列文章之二 用cocos2d-js和pomelo开发MMORPG传奇手游-启动游戏续(一)
- 如何配置vim
- 漫谈 iOS Crash 收集框架
- ng-include
- 相机拍照
- 10340 - All in All
- Linux上安装JDK环境变量配置
- 转帖:30多条mysql数据库优化方法,千万级数据库记录查询轻松解决
- nGrinder安装指南