- 浏览: 294276 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
Mybeautiful:
袁光平 写道您好我设置了html格式,但是邮件中的超链接还是不 ...
JavaMail发送html格式的邮件 -
袁光平:
您好我设置了html格式,但是邮件中的超链接还是不能正常显示为 ...
JavaMail发送html格式的邮件 -
springmvc_springjpa:
java程序语言学习教程 地址http://www.zuida ...
Java学习这七年 -
月光照着我:
谢谢~~~
如何阅读源代码 -
nocb:
我还是建议博主,要把知识面放宽一些, 各种语音 和框架都了解一 ...
Java学习这七年
关于接口与抽象类的区别, 有着千篇一律的答案,我就不重复那些了, 什么可以实现多个接口,但只能继承一个类;抽象类中可以有方法是的实现,而接口没有, 等等......
那都没有说错,但没有说的问题的关键. 为什么接口跟抽象类有那些不同, 这些不同的根源是什么? 根源是它们的真正含义,或说作用是截然不同的. 不同在哪里? 一言以辟之, "抽象类是为了把相同的东西提取出来, 就是为了重用; 而接口的作用程序里面固化的契约, 是为了降低偶合." 下面进行详细阐述.
先说抽象类, 它的作用归根到底其实就是为了重用. 这个重用包含几个层次的重用, 都知道的方法重用, 几个类有共同的特质, 我们就把他们公用的东西提取出来, 搞了个父类, 而这个父类有些方法不知道怎么实现, 就搞成抽象的吧. 所以抽象类就诞生了. 还有一个重用层次是结构的层次, 很典型的就是 Template模式, 它重用的不是一般的方法,而是做某类事情的通用算法,我称之为结构的重用.
再谈接口, 这是我想重点说的, 因为我想让接口真正回归它本来的面目. 接口就是契约, 软件系统内部的契约. 那电脑硬件打比方, 内存条的卡口就规定好多长,卡位在哪. 这样造主板的按这个契约留好口, 造内存的外形也按这个造, 都造好了, 才能工作. 任何一方不守规矩,直接导致造电脑失败. 这个造电脑, 主板跟内存接口是什么? 是我们看到的主板上那个卡口吗? 不是, 接口是内存厂商跟主板厂商之间的契约, 这份契约可能是一份双方签字的文档,也可能是一个电话达成的共识. 而编程语言的接口Interface, 就对应那分签字的文档或是一个电话的共识, 只是它是程序化了的, 相关双方都没有办法违约的;我告诉你了我要这个接口, 你也答应实现, 那你就必须实现, 否则编译就过不了; 所以它是一种固化的强制的契约.
搞清楚了接口跟抽象类的这个本质区别, 它们真正的作用. 就不会再说"这个地方, 用抽象类还是接口都可以"这样的话. 也许的确是都可以,但是该用哪个呢?
----------------
本贴在论坛隐藏,但大虾们并没有说出像样的不同意见. 在此补充一下,
当一个类实现一个接口,就是对所有其他“人”说,我现在可以做这个事情了! 就是完成了interface规定的契约 或说协议。 而一个类实现另一个类时,并没有这个功能,它最多只是做了些同父类不一样的事情而已。
----------------------------------------------------------------------
张瑜,Mybeautiful, zhangyu0182@sina.com.
评论
接口可以表示“契约”,但不就是契约,
还可以表示其它的,简单说 鸟类继承了 动物(抽象) 又实现了 Flyable,flyable也是契约吗?
“flyable也是契约吗?”是,你说你flyable,就一定要flyable,对使用该flyable接口的类/接口承诺了fly的能力, 这就是契约啊。
接口可以表示“契约”,但不就是契约,
还可以表示其它的,简单说 鸟类继承了 动物(抽象) 又实现了 Flyable,flyable也是契约吗?
要对现实世界的问题进行处理,必须进行分解。抽象是一种高超的分解方法,通过对问题进行分析、归纳、形成高层的抽象认识,把问题分解成从一般到特殊的若干层次。在java中的接口、抽象类、一般类 是为了实现这种分解办法而提供的语言要素。
抽象的目的是什么? 把一般和特殊分开。 为什么要把一般和特殊分开? 是为了重用 一般。
抽象的目的是为了解决问题。在需求分析中,也是要进行抽象的,而在做需求时,无所谓重不重用。
正是因为OOA中的分析方法,可以在软件中得到表达,才能实现OOA到OOD在理论上的无逢过渡。
你说的重用,只是一种编程技巧吧?
要对现实世界的问题进行处理,必须进行分解。抽象是一种高超的分解方法,通过对问题进行分析、归纳、形成高层的抽象认识,把问题分解成从一般到特殊的若干层次。在java中的接口、抽象类、一般类 是为了实现这种分解办法而提供的语言要素。
抽象的目的是什么? 把一般和特殊分开。 为什么要把一般和特殊分开? 是为了重用 一般。
要对现实世界的问题进行处理,必须进行分解。抽象是一种高超的分解方法,通过对问题进行分析、归纳、形成高层的抽象认识,把问题分解成从一般到特殊的若干层次。在java中的接口、抽象类、一般类 是为了实现这种分解办法而提供的语言要素。
同意! Abstract是为了“公共部分”的封装,也就是重用;一般上业务接口都是针对interface来设计,为什么要针对接口设计呢? 就是为了解耦。
所以怎么答都有理
这是我在CSDN上的帖子,讨论了接口和内部类的区别
另外,interface却常常与抽象类在一起使用。定义了interface,经常需要用一个抽象类来吧共同的行为实现,而留下具体的行为给继承类去实现。
1. "在C++中根本就没有interface这个东西,需要用纯虚函数和宏模拟", 那正好说明 C++中的Interface就是“纯虚函数和宏模拟”一起实现的 (本人不了解任何C++,从字面意思推测的);所以从逻辑语义来将,无论C++还是java都有抽象类跟接口的概念,当然就都有其不同的使用场景了。
2. "如果是从设计的角度,就不应该提这个问题", 用什么不用什么,恰恰就是一个设计问题,详细设计中是一定要写清楚的。
3. "interface却常常与抽象类在一起使用。定义了interface,经常需要用一个抽象类来吧共同的行为实现", 恕不敢苟同, 就像男人跟女人一样,他们可以结婚一起生活,也可以选择单身,或是Gay都是完全允许的。 需不需要一起使用, 就如同wumingshi所说,要看场景,并非他们天然就需要一起用,或是一起用更好。
另外,interface却常常与抽象类在一起使用。定义了interface,经常需要用一个抽象类来吧共同的行为实现,而留下具体的行为给继承类去实现。
发表评论
-
网页抓取之新方法 (在java程序中使用jQuery)
2012-03-07 13:57 11637你想要的任何信息,基本上在互联网上存在了,问题是如 ... -
也说递归
2011-12-23 11:41 1354递归算法是程序员的最重要的基本功之一,也是相对 ... -
编码的依据是什么?
2011-09-21 15:11 1384编码的依据是什么?很多人也许是不假思索就回答“需求!” ... -
jvisualvm结合jstatd进行远程监控
2011-08-31 16:33 7917jvisualvm是Jdk自带的,具体点,据说是 ... -
Visitor模式通俗化
2011-08-29 14:12 156223种设计模式中,最难理解的可能就是Visitor ... -
如何阅读源代码
2011-08-24 14:03 10646众所周知,要想 ... -
废话Log4j
2011-07-26 11:41 1466使用Log4j去管理日志多年了,基本每次都是按照前 ... -
使用POI操作Excel的代码
2011-06-20 09:18 2875经常会碰到把数据存到excel的需求,虽然使用POI写 ... -
使用Cobra解析html, 及其提取table内容的例子。
2011-04-07 09:40 2248以下方法读取一个html格式的String,然后把其中 ... -
MD5加密及随机数生成
2011-02-25 11:19 3747今天贴两个简单的方法,需要的时候不用自己再写, ... -
我不知道何谓动态绑定
2010-10-22 16:01 1216CSDN有一贴问何谓 ... -
得到当前系统中所有线程的办法
2010-09-27 11:15 1672有时候我们希望找到系统中的所有线程,有没有什么办法呢? ... -
从源头上捕获线程中产生的异常
2010-09-26 18:01 1276我们经常碰到线程突然死掉,但是又找不到原因,总不能在每 ... -
Java 读取本机IP地址
2010-08-19 12:35 1755今天要跟大家分享的是,一个读取本机ip地址的方法。 ... -
TCP实现P2P通信、TCP穿越NAT的方法、TCP打洞
2010-07-14 11:35 1571先看一下技术背景:Inte ... -
Quartz配置...
2010-06-18 08:58 1235关于cronExpression的介绍: 字段 允许值 允许 ... -
封装好的类,使用httpClient访问网页。
2010-06-10 13:13 2078做了好几个httpclient访问网站的项目了,我发布 ... -
使用Server转发的聊天程序 (短小精悍,无重复代码, 支持多客户端)
2010-05-05 10:51 3153Server 入口程序, 仅一个类,其中 hsCli ... -
Java学习之路拾遗
2010-01-30 13:12 1178学习最大的天敌就是忘记,所以我想把我这几年的学习的东西,一点一 ... -
Java学习之路(三)
2010-01-29 20:48 1077...
相关推荐
主要介绍接口与抽象类的区别,为那些困惑的人指点迷津。
11.java接口和抽象类的区别.zip11.java接口和抽象类的区别.zip11.java接口和抽象类的区别.zip11.java接口和抽象类的区别.zip11.java接口和抽象类的区别.zip11.java接口和抽象类的区别.zip11.java接口和抽象类的区别....
C#类、接口、虚方法和抽象方法-接口与抽象类的区别实例 C#类、接口、虚方法和抽象方法-接口与抽象类的区别实例
接口与抽象类的区别 抽象方法是必须实现的方法。就象动物都要呼吸。但是鱼用鳃呼吸,猪用肺呼吸。 动物类要有呼吸方法。怎么呼吸就是子类的事了。 现在有很多讨论和建议提倡用interface代替abstract类,两者从...
抽象类与接口的区别,抽象类与接口的具体应用
4.实现抽象类和接口的类必须实现其中的所有方法。 抽象类中可以有非抽象方法。接口中则不能有实现方法。如果接口或者抽象类的子类不想实现则继续携程一个抽象方法 5.接口中定义的变量默认是public static final ...
抽象类和接口的区别 在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力。abstract class和interface之间在对于抽象类定义的支持...
java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例...
(3) 抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明为抽象类 (4) 具体派生类必须覆盖基类的抽象方法 (5) 抽象派生类可以覆盖基类的抽象方法,也可以不覆盖。如果不覆盖,...
java 抽象类与接口的区别
Java中的类、抽象类和接口的区别和联系
抽象类和接口 区别分析抽象类和接口 区别分析
在Java语言中,abstract class和interface 是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,...
深入浅出的说明java抽象类与接口区别,让初学者更好的理解java抽象类与接口的概念
接口与抽象类的区别java基础一些东西,这些东西在面试中是常考的。大家可以看看
抽象类和接口的区别
Java接口与抽象类的课件,适合初学者,主要对接口与抽象类进行简要介绍,PPT版本。
抽象类与接口 抽象类与接口 抽象类与接口 抽象类与接口
接口与抽象类区别PPT优秀资料.ppt