站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题实现接口,为什么一定要实现接口中的所有方法

实现接口,为什么一定要实现接口中的所有方法

摘要: 实现接口,为什么一定要实现接口中的所有方法


不是很明白,请哪位帮助给出一个权威的答案.


这就是接口的特点啊!

可以防止因为大小写之类的原因写错了方法名。



如果可以不实现接口中的所有方法,那就失去了接口的意义了。
比如实现接口Car的对象都可以run(), 你就必须要提供run()方法。

你要是不提供,那就不是Car接口的实现了


接口这样描述自己:-#34;对于实现了我的所有类,看起来都应该象我现在这个样子!!-#34;.
因此,采用了一个特定接口的所有代码都知道对于那个接口可能会调用什么方法.这便是接口的全
部含义.所以我们常把接口用于建立类和类之间的一个“协议”。


为了让编译能通过.


还是不太明白.
谁可以解释一下.


我也不太明白,为什么银行的保险柜TMD要锁着呢,为什么不让我进去拿点出来呢.



肯定是有点缺点就是了, 但是我觉得1楼的说得很在理。


接口提供了方法的描述
所有要实现这些接口的类都要实现其描述的方法,否则就不能成为这些接口
就这么简单啊



呵呵,我说说我的见解:
比如你有一个水管的接口,下面的如果细的话,结果可想而知。
瞎猜得!


to jihanzhong
如果可以不实现接口中的所有方法,那就失去了接口的意义了。
--------------------
接口的意义在于它的高度抽度,可以让代码更好的得到重用性.

可是这种回答似乎又与我的问题不相符.
烦请各位gs解答.


谁说一定要实现所有方法了?抽象类就可以只实现一部分。


当然,抽象类不能实例化,但那是另外一个问题,跟楼主的问题无关。


万一你不实现。。。。而项目组的人使用的了这个接口,调用了一个未实现的方法。。。。多么恶心的事情会发生你知道?


如果在设计语言的时候(不管是java的接口、抽象类,或者是c++的虚机类),
如果可以只实现接口中的部份方法,这样在用户在使用时候的灵活性不是更大。
同样也是可以实现多态的机制的。


而具体类是一定要实现的。因为作为一个具体类X,它既然声称实现了接口I,那就是说在所有需要一个I类型的引用的时候,我们都可以放一个X类型的对象上去(原因就是X声称它已经实现了接口A),比如:
I i = new X();
但假如I接口有一个方法f(),X类并没有提供它的实现,那么,对于上面这个i,如果要调用:
i.f();
的话,会出现什么问题呢?

说了半天,感觉越说越不对劲,好像自己是在用定理来证明公理。楼主应该是钻牛角尖了。
通常一种语言的语法是根据它想要实现的目的来制定的,上面的之所有有问题,就是因为JAVA既然要支持面向接口编程,必须这样规定语法。

否则,如果我们写程序的时候,每次从接口上调用一个方法的时候,还要先检测一下:
if(i.IsImplemented(i.f))
那就像前面某位朋友说的,要接口还有啥用啊?直接从Object上进行检测不就得了?总归所有的类都从Object继承来的。
而且如果检测失败了怎么办?抛出异常?何必呢?——自己写一们半垃子类,就是为了让别人抛异常。。。。


//如果可以只实现接口中的部份方法,这样在用户在使用时候的灵活性不是更大。
//同样也是可以实现多态的机制的。

——如果你经常发现某个类只需要实现某个接口中的一小部分方法就可以很有用了,那说明那个接口的设计有问题了,它太大了,它应该分成多个接口的。
——看看JAVA标准库中的接口,大多数只有一个方法,不超过3个的差不多占到90了,没仔细数过,感觉上的。


90%。


to steedhorse(晨星)

上面的问题引出来运行时和编译时检查的问题。
我想jvm现在已经可以检测出这样的问题了。
如果实现我说的只继承接口的一部份,而在用户调用的时候给出提示是没有任何问题的吧。
如果这样的实现,是否给我们的程序给出了更大的活灵性呢?
因为有的时候我们只是想用接口一部份方法,而不是全部。
也许有人说这是我们的设计不好导致的,可我想说,哪一个程序没有这样的问题呢?


呵呵
我还没写完,steedhorse(晨星) 就已经说我们的设计有问题了。

可除了jdk外,其它所有的程序或多或少的都会有一点这样的问题存在的吧。



接口是特殊的类,他的特点主要在于让实现他的所有类都是和他相关的。这就为面向对象做了个很好的解释。比如说,定义一个车子的接口,里面定义了启动,挂挡,前进,后退这四个方法的话,那么这个接口其实就是一个车子的型号,他告诉别人,从这个接口定义的车子是有这四个功能的,没有这四个功能的就不是这个牌子的。但是它又不控制别人有同样的功能,比如说我公司的东风牌只有这四个功能,你公司的解放牌也可以只有这四个功能的。所以接口就好象一个型号的东西,而实现接口就是建立一个这种型号的车厂,每个实现这个接口的实例就是这个车厂生产的车咯。
对于不同的实现会有不同的效果,比如我的东风牌和解放牌同是我公司不同厂生产的,他们就是同个型号的车(比如都是拖拉机,呵呵),但是我东风牌倒车的时候会说:倒车请注意;但是解放牌它就不会说。
所以说,实现接口就应该实现它的全部方法咯。


这是JAVA的规定呀??
有谁说的清楚呢??


//也许有人说这是我们的设计不好导致的,可我想说,哪一个程序没有这样的问题呢?
——那肯定是要克服,我觉得。

//上面的问题引出来运行时和编译时检查的问题。
//我想jvm现在已经可以检测出这样的问题了。
//如果实现我说的只继承接口的一部份,而在用户调用的时候给出提示是没有任何问题的吧。
//如果这样的实现,是否给我们的程序给出了更大的活灵性呢?
//因为有的时候我们只是想用接口一部份方法,而不是全部。
这个当然不能只依赖编译时检查,那样的话,软件开发将会变成一个噩梦。
你不能只考虑只有一个人,一家公司在写代码。有时候多个项目组需要合作,而且还可能用到N多其它公司的库,而且别的公司在开发它们的库的时候,咱们的公司可能还没成立,而且它们可能别有项目组,别有公司还可能定期升级它们的库。

比如说A公司写了一个库,支持一种回调机制,你只要写一个实现了接口I的类X传给它,它就可以调用接口上的方法来完成一些功能,假如B公司在A公司发布了这套库之后才成立,现在B公司想用这套库里的功能,但它并不想实现接口I的全部接口,那这怎么办?让A公司再改个新版本出来?

再举个更具体的例子,java.sql.DriverManager类有一个静态方法,它返回一个接口类型:Connection,这里的Connection的实现类肯定是别人写的,而且源代码不会公开出来,那么我们编程时,写到这里了:
Connection conn = DriverManager.getConnection(……);
下一步怎么办?——我现在还不知道Connection接口上的哪些方法被实现了,哪些方法没被实现,后面的的程序我怎么写啊?
或者我百般调试,小心翼翼的,终于有一天,我通过各种方法测出了所有已被实现的和未被实现的方法,于是,我忍辱负重,而且由于我水平高,仅仅用那些已经实现了的方法竟然也完成了任务。。。
然后,有一天,那个做数据库的公司说它们的java驱动要升级了,这一次,它们决定去掉a,b方法的实现,而增添原来没有的实现的c,d,e方法的实现——555,我TM容易嘛我。。。。。


规定必须实现所有接口中的方法,就像英语的语法,都是约定俗成的


如果一个方法应该有默认实现,那么显然它应该做成基类或抽象基类,而不是,或者不仅仅是做成接口。一具方法有默认实现,哪怕它是空的,那也跟不实现是完全两种含义。

就拿java.awt.event包里的两个类来说,WindowListener接口声明了各种事件,而有时候你不一定想处理所有这些事件,于是你可以从WindowAdapter继承,而不是实现WindowListener方法,为什么,因为WindowAdapter实现了WindowListener中的所有方法(空函数,表示啥也不做),你只需要覆盖你想处理的方法,比如你只想处理窗口关闭,而不想处理窗口最小化方法,那么你就让windowIconified方法保持从父类继承来的空白函数体好了。
这样就表示:“窗口最小化时,我的程序啥也不做”,而不是“窗口最小化时,我的程序发生未实现异场”——而后者也就等价于说:“我做梦也没想到窗口竟然还会被最小化。”

至于刚才楼主说“可除了jdk外,其它所有的程序或多或少的都会有一点这样的问题存在的吧。”,那大言不惭的说,我写的接口就从来没有这种问题。因为一旦发现有太多这样的需求,我会把它做成基类或抽象基类,而不是接口。


我倒觉得interface最大的好处就是编译器保证它的所有方法都会被实现,否则编译就过不了。
这样在使用别人写的类时就不用提心吊胆,也不用不停地去翻文档,手册,它就是升级了我也不怕。除非它不再支持那个接口了——那样的话,我就发誓再不使用他们写的库了。


如果你不喜欢实现所有的方法,可以使用抽象类去实现,然后继承抽象类.这样就可以只进行你感兴趣的操作了.可以自己做抽象类,也有现成的.


深圳java程序员博客,为你提供多方面资料http://drivemewild.blogchina.com


觉得简单点说,接口可以看作是一种机制。它的提出就是为了定制必须满足某些功能的类(类必须实现接口定义里的全部方法)


接口和抽象类的理解

http://www.cnblogs.com/shengshuai/archive/2006/08/31/InterfaceAndAbstract.html


因为接口可以理解为一个抽象类(当然还是有很多区别的)
里面的方法默认都只能是public abstract的抽象方法
要是不实现它的所有方法 那么这个实现它的类也成为一个抽象类啦 就不能创建对象了


MARK,晨星这里是一个星。
在C++版是晨星星星。



Mark!


还有,楼主不要以为接口仅仅是为了实现多态。
那样的话,根本不需要接口这个概念了,类本身实现多态不是已经很好了吗?
接口的意义也不仅仅在于可以模拟“多继承”,那只是一个副产品而已。

我觉得接口最大的好处就在于能以一种耦合更松散,也更加集中、明确的方式来表达一个对象能提供的和/或所需要的服务。


可以这样理解:

接口:是毛泽东思想 (领袖的精神)

抽象类:继承或者继续拓展毛泽东思想 (领袖精神的传播者)

类:根据毛泽东思想去实践 (既然接受了毛泽东思想,就得按照毛泽东思想去办事,这些

人就是老百姓啊)


同意,一个接口就代表一个类型,接口中的方法就代表了这个接口能干什么,你实现一个接口,就是为了让别人把你当这个类型看待,当别人把你当这个类型看待的时候,他们就会去用这个类型去干它能干的事,而这个类型就会让实现了这个类型的类去做这些事,所以实现类必须保证自己能做这些事。


to steedhorse

我明白你说的意思.我曾经也是像楼上各位一样这样的一种理解方式.可我总是觉得这样有太牵强了.不能完全的让自己信服.所以请教此问题.

谢谢大家.
可能是有点专牛角尖了.


ps: 晚上结帐.


接口就是规定具体动作的实现
不如 不同的 人有不同的打领带的方法 ,所以要在实现的时候把具体的方法写出来

不过也有可能 interface里的方法太多了
有些不需要实现,可以用适配器模式


呵呵,难道真的搞得全世界的程序员天天以泪洗面了你才会信服?:)

你想要干什么,你应该通过明确的方式表达出来,你不实现那个函数,那让编译器怎么处?是认为你想在那个方法被调用时抛一个异常,还是什么也不做?因为做为语言和编译器的设计者,它必须考虑周到所有的情况。

如果你想要的是前者,那么你应该用一个空的方法实现它;而如果是后者,那么你可以实现它,在函数体里手工抛异常(既使接口中没有定义异常规范,你也可以抛运行时异常)。但就是不要“啥也不说”,“不表态”。

如果你认为语言应该设计成,“默认没实现就啥也不做”,那说明你还是认为需要实现。因为“啥也不做”也是一种实现,是一种行为,而且是一种非常确定,而不是模棱两可的行为。

除了编译器,库的实现者也将很难处,最简单的例子:
java.util.Collections有个sort方法,可以为集合排序,只要集合里的元素实现了Comparable接口就行。
这个方法估计上个世纪就写好了,也调试通过了(并没有什么编译错误)。
10年之后,出现了一个人,它想要实现Comparable接口,但它不愿意实现其中的compareTo方法,他说“我只是想实现这个接口而已,凭什么让我实现里边的方法?”,然后它想用sort函数来给它的这种数据排序,但通不过了,于是他就打电话给Sun:“你们的库是怎么设计的!?不懂编程就别开公司!”。于是在一个无人的夜,sun公司有个程序员伤心的哭了……

这么明显的道理,实在不知道楼主究竟卡在哪里了。
你既然根本不欣赏JAVA的interface设计,那我很不明白你为什么不用一般的类或抽象类呢?
难道仅仅是为了多继承才使用了接口?——你可以认为JAVA不支持多继承是一个缺陷,但那完全是另一个问题,那个问题也值得讨论,但它跟interface却一点关系都没有,JAVA的interface还是非常棒的。


借个地方,请教:用接口实现vc中的多重继承如何实现??


接口,说白了就是一个定义了行为规范的东西。
就象是法律规定一样。
他用来约束你的行为。如果你实现他而不遵守他的规范那你实现的就是不是他这个接口!


rikee19810706() ( ) 信誉:100 Blog 2006-09-05 10:58:00 得分: 0

借个地方,请教:用接口实现vc中的多重继承如何实现??

==================
——只能适当模拟,无法完全实现。


alex9521(断--言) ( ) 信誉:100 Blog 2006-09-05 11:03:00 得分: 0

……
他用来约束你的行为。如果你实现他而不遵守他的规范那你实现的就是不是他这个接口!

==================
同意,楼主还是没有理解什么是接口,当然也就无法想通为什么具体类就要全部实现接口的函数。要么就是“默认空实现”跟“完全不实现”两个概念没搞清。


如何适当模拟?


就是实现多个接口呗。
——当然离C++的多重继承还想去甚远。


虽然实现了多个借口,但是这些接口中并没有实现啊,实现了有什么意义呢,还不是自己要重新编写?


所以说不是一回事,想去甚远啊。:$
只是表面上仿佛模仿了C++里那种实现了多个纯虚基类的效果。


JAVA通过内部类和代理方法也可以再“模拟”一点多继承——模拟那种同时访问多个类的protected方法的效果。


@^@ --
去找本-#60;core java-#62; 看看
里面有详细的解释


本来想说上一大堆来回答楼主的问题的,但楼主也不是初学者,说那些没意思。

我只想说一句:JAVA是比C++设计得更严格的语言,你如果要问为什么,就去问SUN吧。


再补一句:如果你认为语言需要改进可以给SUN写信,并说服他们采纳你的意见。哈哈


这个问题能讨论出这么多内容,实在太出乎我的想象了。

如果楼主问“实现接口,为什么一定要实现接口中的所有方法”,那么,我的第一个回答是:这是 Java 语言的要求,不这样做就编译不过去。

如果楼主再问“Java 语言为什么要这么要求”,那么,我的第二个回答是:这样的要求有好处,不这样要求有很多坏处。

如果楼主再问“这样要求有什么好处,不这样要求有什么坏处”,那么,……,我已经不知道该怎么回答了,因为前面 steedhorse(晨星) 老兄的回答已经详尽、生动、精辟到无以复加的程度了! ^_^


楼上老兄谬赞了,呵呵。
最近像是得了强迫症了,看到别人想不明白就比别人还着急。。。

其实楼主多跳出来想一想软件开发在时间和空间上都不一定是线性的就明白了。
N多的个人,小组,公司,团体在前后甚至长达几十年的时间里(当然不可能按调用次序安排这个些的工作)开发出来的库,模块最终要连在一起。使用接口的人,声明接口的人和实现接口的人根本就不认识,怎么可能随随便便想实现谁就实现谁呢?


再也不回这个帖子了。


接口中只是方法的定义,并没有实现,如果接口中的方法不被实现,那这个方法在类中就没有,而Java中可以有接口类的引用。这样就可能出现有的方法无法引用,而产生异常。


↑返回目录
前一篇: 2个双循环的问题!!
后一篇: 对象的比较