温故知新---抽象类和接口的异同
2015-08-23 21:48
381 查看
【概念定义】
抽象类(abstract class):抽象类通常代表一个抽象的概念,是对不能具体实例化而又具有意义的一种类的抽象。比如狮子老虎是一种动物,对它们进行抽象得到抽象类动物类,但是动物类是不能被实例化的。
抽象类的界定:如果类中至少具有一个抽象方法(可以含有一般方法),那么它就是抽象类。这个抽象方法需要在被子类继承时必须重写。
接口(interface):接口是一种公共方法或规格的集合,它没有修饰符和方法体(方法的具体实现),它只能被实现。
接口的作用:接口为类的实现提供了一个接口,对方法和实现进行了解耦。多个类可以同时实现一个接口,实现接口的类必须实现接口中的属性和方法。
【相似】
1。都不能被实例化。
2。都包含虚方法或抽象方法。
3。可以通过继承和实现的方法实现其抽象方法。
【区别】
形态上的区分:
1.抽象类可以包含一些方法的具体实现,而接口里只能有方法。
2.抽象类可以被子类至少部分实现,接口则是全部实现。 3.两者和类的关系:一个类只能继承一个抽象类;多个类可以实现一个接口。
实现上的区分:
1,概念上讲,接口是对一组类的公共行为的一种抽象,而抽象类是对一组类的抽象。例如:狮子老虎都具有叫、跑的方法行为,抽象出来就是接口;而对狮子老虎抽象出的动物类就是抽象类。
2,如果行为跨越不同类的对象,使用接口;如果行为属于一些类似的对象,使用抽象类。
例如:对于叫这个方法,如果实现的对象是狮子老虎这类属于动物的,适合用抽象类,因为他们都可以继承动物抽象类;但是如果实现的对象包括动物、人、机械等不同类别的,适合用接口,因为多个类可以同时实现接口。
感受:从这个角度来说,它其实默认的是对已确定的类的区别。比如老虎和狮子,它们可以抽象成动物类,将虚方法写入动物类,被子类继承。但是换个角度想,将动物和人抽象,它们都是生物类,可以将叫的虚方法写入生物类,这样的话,仍然可以使用抽象类。
也就是说,如果对于已经确定了的类(不会改动数量或类别),可以知道都有什么类,那么它就可以进一步抽象使用抽象类;但是如果是对具体的类的数量和种类不清除的情况下,最好使用接口。因为接口可以对多种类开发端口。这也反映了它们的一个特性:接口是自上而下的设计,抽象类是自底向上的抽象。
3.接口比抽象类更加灵活。
针对扩展修改这一方面,如果出现了新的需求,尤其是在对同一方法实现的对象的类别发生了改变,那么使用抽象类是不合适的。接口可以很好的应对需求的改变。
抽象类(abstract class):抽象类通常代表一个抽象的概念,是对不能具体实例化而又具有意义的一种类的抽象。比如狮子老虎是一种动物,对它们进行抽象得到抽象类动物类,但是动物类是不能被实例化的。
抽象类的界定:如果类中至少具有一个抽象方法(可以含有一般方法),那么它就是抽象类。这个抽象方法需要在被子类继承时必须重写。
接口(interface):接口是一种公共方法或规格的集合,它没有修饰符和方法体(方法的具体实现),它只能被实现。
接口的作用:接口为类的实现提供了一个接口,对方法和实现进行了解耦。多个类可以同时实现一个接口,实现接口的类必须实现接口中的属性和方法。
【相似】
1。都不能被实例化。
2。都包含虚方法或抽象方法。
3。可以通过继承和实现的方法实现其抽象方法。
【区别】
形态上的区分:
1.抽象类可以包含一些方法的具体实现,而接口里只能有方法。
2.抽象类可以被子类至少部分实现,接口则是全部实现。 3.两者和类的关系:一个类只能继承一个抽象类;多个类可以实现一个接口。
实现上的区分:
1,概念上讲,接口是对一组类的公共行为的一种抽象,而抽象类是对一组类的抽象。例如:狮子老虎都具有叫、跑的方法行为,抽象出来就是接口;而对狮子老虎抽象出的动物类就是抽象类。
2,如果行为跨越不同类的对象,使用接口;如果行为属于一些类似的对象,使用抽象类。
例如:对于叫这个方法,如果实现的对象是狮子老虎这类属于动物的,适合用抽象类,因为他们都可以继承动物抽象类;但是如果实现的对象包括动物、人、机械等不同类别的,适合用接口,因为多个类可以同时实现接口。
感受:从这个角度来说,它其实默认的是对已确定的类的区别。比如老虎和狮子,它们可以抽象成动物类,将虚方法写入动物类,被子类继承。但是换个角度想,将动物和人抽象,它们都是生物类,可以将叫的虚方法写入生物类,这样的话,仍然可以使用抽象类。
也就是说,如果对于已经确定了的类(不会改动数量或类别),可以知道都有什么类,那么它就可以进一步抽象使用抽象类;但是如果是对具体的类的数量和种类不清除的情况下,最好使用接口。因为接口可以对多种类开发端口。这也反映了它们的一个特性:接口是自上而下的设计,抽象类是自底向上的抽象。
3.接口比抽象类更加灵活。
针对扩展修改这一方面,如果出现了新的需求,尤其是在对同一方法实现的对象的类别发生了改变,那么使用抽象类是不合适的。接口可以很好的应对需求的改变。
相关文章推荐
- 应用程序和VFS之间的接口是系统调用
- 【Python】[面向对象的高级编程] 元类 ---听说这个很难理解
- c& c++ enum
- WIN7+WDK7600+VS2008+DDKWizard搭建内核驱动开发环境
- BestCoder #52
- String, StringBuffer, StringBuilder三者区别
- linux内核中的IS_ERR()、PTR_ERR()、ERR_PTR()
- 它们的定义ListView,实现Item除去滑动和滑出菜单效果
- 【Python】[面向对象高级编程] 多成继承,定制类,使用枚举
- 坚持不懈之linux haproxy的配置文件关键字查询手册
- matlab学习笔记 函数bsxfun repmat
- Java编程语言概述
- windebug查看KeServiceDescriptorTable
- Nginx基本数据结构之ngx_http_request_t结构体
- BestCoder #50
- POJ 2349 Arctic Network
- 附上windebug常用调试命令
- WINDOWS 7 配置驱动开发环境(wdk7.60)
- Bestcoder #49
- java多线程同步及最大线程数目