Java中使用接口的好处
群网友回复:
我要开车去北京 不管你给我宝马还是BYD 我只管调用车的go()方法就行
能够实现2种类或是多种类所约定的一种概念约定,来使这2种类或多种类能以这个被实现的概念约定来协调的,紧密衔接的工作。
举个不太对但听形象的例子:比如键盘那 你不管用那个厂家的键盘 插上都能正常工作因为只要键盘实现了那个接口就电脑就能识别
就是你可以用别人的名字干好坏事让找不到你
就是强约定 不提供默认实现的强约定
没有默认实现 就没有提前设置的状态 也就是自己能控制所有的
Extends是有害的;也许对于Charles Manson这个级别的不是,但是足够糟糕的它应该在任何可能的时候被避开。“JAVA设计模式”一书花了很大的部分讨论用interface继承代替实现继承。
好的设计者在他的代码中,大部分用interface,而不是具体的基类。本文讨论为什么设计者会这样选择,并且也介绍一些基于interface的编程基础。
查阅资料:
《Java编程思想》:
接口是特殊的抽象类。
interface 不仅仅是一个极度抽象的类,因为它允许人们通过创建一个能够被向上转型为多种基类的类型,来实现某种类似我重继承的特性。
完全解耦。只要一个方法,操作的是类而非接口,那么你就只能使用这个类及其子类。如果你想要将这个方法应用于不在此继承结构中的某个类,那么你就触霉头了。接口可以在很大程度上放宽这种限制,因此,它使我们可以编写可复用性更好的代码。
通过接口可以实现多重继承。
《Java核心技术 卷I:基础知识》
接口与抽象类:使用抽象类表示通用属性存在这样一个问题:每个类只能扩展于一个类。
Java的设计者们选择了不支持多继承,其主要原因是多继承会让语言本身变得非常复杂,效率也会降低。
为了避免这类问题的出现,Java语言利用接口机制来实现多继承的大部分功能。
谷歌搜索:
接口是用来规范类的,它可以避免类在设计上的不一致,这在多人合作的开发中犹为重要
就比如接口中有A方法,那么实现这个接口就必须实现A方法,这就形成了一种规范
首先接口出现的意义就是帮助Java语言实现一个类似于多继承的功能.但是实现的多继承功能不会使代码中的类之间出现网状关系,而是比较清楚的树状关系,类似于家谱的感觉.
接口也不是什么都好的,一般在开发的时候接口是不会随便改动的,因为接口的改动就意味着要变动它的所有实现类.
实际应用中,接口中是对外公开的模块的业务方法,而且接口的命名更符合我们对接口(具体实物)的理解,比如USB接口,我们在理解的时候可以以一个实物的方式来理解.
另外,JVM在加载接口的时候,对接口的空间分配(堆与栈梆定)与类是不一样的.这也就是为什么JAVA里没有类之间的多继承,而是用接口来实现一个多继承的模拟.
类是对象的抽象,接口是类的抽象。
接口就是规范,在整个系统设计中,涉及到很多层,为了使各个层之间调用透明话,你只需要知道接口,按照这个接口做你具体做的事情,就可以融合到整个系统中了。
生活中的例子很多,例如:插头、插座,有标准的规范告诉你插头应该是几个脚,插座是几个孔等等,做插头、插座的公司就是根据这个规范来做插头、插座,而不需要做完一个插头就跑遍全世界去试用一下这个插头做的对不对。
问:
java中的接口到底有什么作用,有什么优点,书上说java只支持单继承,要想继承多个类的话就要用到接口,这就是java的优点,但是用了接口还得把接口中的那些方法全都重写,这有什么意思呢,还不如直接在该类中直接再定义一个方法,何必去继承呢?
答:
无需多言,你想想我们平时用的电源插座与电器电源接头之间是什么关系。用个比喻应该更容易接受。插座不就是一个借口,所有的电器如果想要用电,就必须接受这个规格的插座,就是必须实现所谓的接口,具体你这个电器用来干吗,我插座(接口)就不管你了,也就是功能与规范是分离的,不相干予。假如你如果想用三头插,那好,换另外个接口,你电器接头必须实现有三插的接头规范。接口就是个规范而已。
比如说
有个座充,它可以充诺基亚,可以充索爱,只要电池的型号一样。
而你自己带的可能只可以给自己的手机充电。
那么这个座充就可以看做是接口,它可以插不同的电池,只要规定一定的规格。它不考虑你是哪个品牌的手机。
或者说
拿电脑的驱动来说。当你换了一个新的硬件,你就必须装驱动。
每个硬件的驱动都不一样,但是操作系统都可以操作他们,这样他们也是实现了接口。
还有许多洋娃娃,他们可以换不同的衣服。
接口使程序更加灵活,机动性号,你喜欢一个可以拼接的玩具,而不是一个整的。
数学中,拆分思想无处不在。同样,语言只是,数学思想的延续
这个问题比较抽象,不过俺给你举个例子,希望对你的理解可以起到微薄之力。
就举一个院长和病人的例子吧,院长就相当于一个接口啦,病人就是普通的类,那么抽象类是什么呢,抽象类就是医院下面的科长啦,比如:胃肠科,眼科等等。当病人去医院就诊,病人不太可能直接找院长治疗,而是去对应的科去挂号治疗。院长就会舒服多了,用程序表示呢,院长会有一个接口叫‘治疗’,科长会实现这个接口,所以科长也会有这个方法的,注意科长是抽象类,所以呢,科长只会继承和他相关的接口,比如财务的接口,科长同志就无需实现啦,这是抽象类的好处,嘿嘿。当然,院长不只一个接口,医院的所有接口,院长同志都应该有的,下面的科长(抽象类)分类继承就是啦,各继承各的,世界就美好了!
1. 从定义中,“接口方法可以在不同的方法被不同的类实现”,说明使用接口能够方便的去扩展,比如你在client中调用了一个接口,以后想用其他的实现,只需要重写一个实现类并扩展工厂就行了。
2. 可复用性,比如大型项目中,将Hibernate换成Ibatis的时候,可以只需要在Spring中配置实现类就可以替换了。接口属性能够方便的配置。
3.项目开发人员的分工
当接口定义好后,不同模块的开发人员可以先根据接口的定义开发自己的模块,提高了开发效率
4.方便早期的设计和以后的扩展
接口最原始的作用在于定义一些规则,这些规则包括业务规则等,当接口定义好之后,就已经确定了大部分宏观的业务逻辑,系统的扩展性和可维护性自然会得到提高。
5.Facade模式的使用
通过定义接口,可以更好的使用Facade模式。将整个系统的功能模块化。
在没有好好地研习面向对象设计的设计模式之前,我对Java接口和Java抽象类的认识还是很模糊,很不可理解。
刚学Java语言时,就很难理解为什么要有接口这个概念,虽说是可以实现所谓的多继承,可一个只有方法名,没有方法体的东西,我实现它又有什么用呢?我从它那什么也得不到,除了一些方法名,我直接在具体类里加入这些方法不就行了吗?
为什么一定要有抽象类这个概念?为什么就不能把这个父类写成一个具体的类,子类再继承它不就可以了吗?何必弄一个抽象类出来,还要弄一些没有方法体的抽象方法,弄得又象接口又象类的,让人捉摸不定。
当我开始学习java设计模式,真正走进面向对象设计的大门之后,我才发现,自己对面向对象设计的理解原来是那么的片面,那么的肤浅,根本就没有真正理解面向对象思想的精髓,在某一种程度上还受着面向过程的影响,以为弄出了一个个类,就算是面向对象了,而其实还是被过程所驱使着。
我还是说说我现在对面向对象思想的理解吧,不一定正确全面,但我想应该还算是比以前略有进步吧。
面向对象思想,我觉得最关键的就是抽象。
一个软件设计的好坏,我想很大程度上取决于它的整体架构,而这个整体架构其实就是你对整个宏观商业业务的抽象框架,当代表业务逻辑的高层抽象层结构合理时,你底层的具体实现需要考虑的就仅仅是一些算法和一些具体的业务实现了。当你需要再开发另一个相近的项目时,你以前的抽象层说不定还可以再次利用呢,面对对象的设计,复用的重点其实应该是抽象层的复用,而不是具体某一个代码块的复用,是不是一下子感觉自己对复用理解的高度又上升了一层?^_^
说到了抽象,我就不能不提到曾让我头痛的Java接口和Java抽象类了,这也是本文我想说的重点。
既然面向对象设计的重点在于抽象,那Java接口和Java抽象类就有它存在的必然性了。
Java接口和Java抽象类代表的就是抽象类型,就是我们需要提出的抽象层的具体表现。OOP面向对象的编程,如果要提高程序的复用率,增加程序的可维护性,可扩展性,就必须是面向接口的编程,面向抽象的编程,正确地使用接口、抽象类这些太有用的抽象类型做为你结构层次上的顶层。
Java接口和Java抽象类有太多相似的地方,又有太多特别的地方,究竟在什么地方,才是它们的最佳位置呢?把它们比较一下,你就可以发现了。
1、Java接口和Java抽象类最大的一个区别,就在于Java抽象类可以提供某些方法的部分实现,而Java接口不可以,这大概就是Java抽象类唯一的优点吧,但这个优点非常有用。
如果向一个抽象类里加入一个新的具体方法时,那么它所有的子类都一下子都得到了这个新方法,而Java接口做不到这一点,如果向一个Java接口里加入一个新方法,所有实现这个接口的类就无法成功通过编译了,因为你必须让每一个类都再实现这个方法才行,这显然是Java接口的缺点。
2、一个抽象类的实现只能由这个抽象类的子类给出,也就是说,这个实现处在抽象类所定义出的继承的等级结构中,而由于Java语言的单继承性,所以抽象类作为类型定义工具的效能大打折扣。
在这一点上,Java接口的优势就出来了,任何一个实现了一个Java接口所规定的方法的类都可以具有这个接口的类型,而一个类可以实现任意多个Java接口,从而这个类就有了多种类型。
3、从第2点不难看出,Java接口是定义混合类型的理想工具,混合类表明一个类不仅仅具有某个主类型的行为,而且具有其他的次要行为。
4、结合1、2点中抽象类和Java接口的各自优势,具精典的设计模式就出来了:声明类型的工作仍然由Java接口承担,但是同时给出一个Java抽象类,且实现了这个接口,而其他同属于这个抽象类型的具体类可以选择实现这个Java接口,也可以选择继承这个抽象类,也就是说在层次结构中,Java接口在最上面,然后紧跟着抽象类,哈,这下两个的最大优点都能发挥到极至了。这个模式就是“缺省适配模式”。
在Java语言API中用了这种模式,而且全都遵循一定的命名规范:Abstract +接口名。
Java接口和Java抽象类的存在就是为了用于具体类的实现和继承的,如果你准备写一个具体类去继承另一个具体类的话,那你的设计就有很大问题了。Java抽象类就是为了继承而存在的,它的抽象方法就是为了强制子类必须去实现的。
使用Java接口和抽象Java类进行变量的类型声明、参数是类型声明、方法的返还类型说明,以及数据类型的转换等。而不要用具体Java类进行变量的类型声明、参数是类型声明、方法的返还类型说明,以及数据类型的转换等。
我想,如果你编的代码里面连一个接口和抽象类都没有的话,也许我可以说你根本没有用到任何设计模式,任何一个设计模式都是和抽象分不开的,而抽象与Java接口和抽象Java类又是分不开的。
理解抽象,理解Java接口和抽象Java类,我想就应该是真正开始用面向对象的思想去分析问题,解决问题了吧。