关于java接口

来源:互联网 发布:c语言函数库详解 编辑:程序博客网 时间:2024/04/27 09:53
类是对象的抽象,接口是类的抽象
接口的最主要的作用是达到统一访问,就是在创建对象的时候用接口创建,【接口名】 【对象名】=new 【实现接口的类】,这样你像用哪个类的对象就可以new哪个对象了,不需要改原来的代码,就和你的USB接口一样,插什么读什么,就是这个原理。就像你问的,都有个method1的方法,如果我用接口,我上面就可以one.method1();是吧?那样我new a();就是用a的方法,new b()就是用b的方法这样不方便吗?这个就叫统一访问,因为你实现这个接口的类的方法名相同,但是实现内容不同我用接口来定义对象不就可以做到统一访问了吗?接口主要针对多个类实现它来说的,要是只有一个类当然可以不用接口了.你这样想,我做一个USB接口,有个read()抽象方法,然后mp3类实现,U盘类实现,移动硬盘类实现,这样我用的时候用USB a=new 【类名】;这样a.read();要是我类名里写U盘,就读U盘,写mp3就读mp3,而这个名字可以从属性文件里读,你写哪个就用哪个了,呵呵。
 
 

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类,我想就应该是真正开始用面向对象的思想去分析问题,解决问题了吧。程序中的接口:程序中的接口主要的作用就是进行功能的组合,使得同一对象能够被使用在多种地方,其重大优势就是应对变化。为什么接口能够很好地应对变化呢?就是因为其职责单一。每只蚂蚁的职责是非常单一的,一块石头砸到蚁群中,死掉大半数量的蚂蚁,但蚁群仍然可以正常工作。如果换做一只大虫子,一块石头砸坏头部、腹部、尾部,虫子不死也奄奄一息了,因为他是一个复杂的整体,各个器官相互依赖才能正常运作。同样的,变化也会让你的程序部分失效,如果你是由接口组合而成的对象,则能够降低变化造成的损失,失效的接口直接舍弃,其他接口仍然还在继续工作。另外,接口是一种更高程度的抽象。初期我们写程序可能对抽象没有概念,纯粹使用数组什么的存储数据,进行操作。后来我们发现面向对象能够更方便地控制,于是将各种现实中的事物都抽象、封装为类。再往后你会发现各个类中也会有很多相似的东西,比如瓶子和锅都有盖,足球和轮胎都能打气,这样高度抽象出来的东西就是接口,足球和轮胎只要都实现“气嘴”接口,就都可以用打气筒对象打气。反之试想一下,你如何用继承来描述足球和轮胎的关系呢?即使实现也会很蹩脚吧?举个简单的例子吧..现在你要开发有一个信息管理系统、要用Access来作为数据库。你速度很快1个星期完成。领导忽然告诉你..再需要一个SQLServer数据库的高端版本;1周后,领导又告诉你再来个MySQL版本的吧..这样丰富点。哥们.你怎么办呢?..你最直接的应该是把你的涉及数据操作的逻辑代码...呼呼..全部改写。你是这样吧!如果用到接口,你就很简单了。首先,定义逻辑操作接口。涉及数据操作的类继承该接口实现。在逻辑层调用的时候,你面对的是接口。直接声明接口,将操作对象直接转化成接口类型。这里用到了一个很简单的知识,多态!继承是实现多态的不二法门。数据实现了接口,那么就具备可接口的所有定义。这是后,如果你换不同数据库的版本的时候,很简单了,只要把数据操作层的实现方法改动就可以了。你的逻辑代码部分不用变动,因为接口没有变动。你是对接口的编程。在团队合作的开发中,面向接口编程是非常多,它的应用也很多。知识在网络上也恨都,如果感觉很抽象的话,那就多看代码实例吧。工业中的接口:笔记本实现了多种标准接口:USB接口、视频输出接口、耳机接口、麦克风接口、网卡接口、网线接口、电源接口,遵守接口的好处不单单是可以使用市面上的通用配件,对于厂内自家生产的多种配件,也能实现兼容。比如一种电源变压器就可以应用于多种型号的笔记本,而不需要专为每一款笔记本生产不同种类的电源。那么你说继承的效果不也一样吗?试想一下,假如我们现在要推出一款超薄的移动性笔记本,强调极致轻薄、无线上网功能。为了极限缩减尺寸,视频输出接口、麦克风接口、网线接口要被舍弃。那么如果是使用继承的办法实现,那怎么弄?继承了好几个没有作用的接口,然后再封上?脱了裤子放屁嘛。而接口模式就很简单了,不需要的接口只要不实现就行了呀。接口一大重要特征就是“职责单一”,USB接口就负责USB设备的衔接,电源接口就负责电力输入,麦克风接口只能插麦克风,你不需要什么功能就不用实现它。所以说接口是可选择的功能组合,而继承只能是全盘接收,在应对变化时,继承远不如接口灵活。 自然界中的接口:达尔文进化论描绘的进化蓝图,就像是一棵继承树,各个物种继承前一个物种并加以变化,形成新的物种分支。但最新的生物研究表明,这棵“树”并不是简单的多杈延伸形式,或者说它更像一只网,新物种的形成不仅仅是继承在发挥作用,还有组合的关系。科学家们发现许多物种的DNA中都包含了很多其他物种的DNA片段,比如牛的DNA中就包括了果蝇和蛇的一部分DNA,人类DNA中包含了很多病毒的DNA,并且某些DNA还是某些功能所不可或缺的。还有像幼体与成体不同的物种中,其DNA中就是有两种不同的物种DNA片段,可以说它变态前是一个物种,变态后又是另外一种,一个比较有代表意义的例子就是海星,海星的幼体变态为成体后,其附属物仍然可以作为一个单独的生命生活数天。科学家认为这些基因的组合可能来源于杂交,而不是正常的繁衍,并且这应当是自然界多态进化的一种重要形式。这种组合关系不是很像接口吗?