java里面的接口到底的存在的意义是什么啊!


接口到底有什么使用价值啊!
我觉得没有接口也一样编程啊,只是麻烦一点,比较容易忘记类之间的联系罢了!

104 个解决方案

#1


这是面象对象设计的需要,如果一个类要具有多个父类的属性,就要用到接口,因为java不象c++那样可以多重继承
比如:
class AFrame extends JFrame implements ActionListener {

}
AFrame 继承了JFrame的属性,方法,同时也要实现ActionListener接口的方法用来进行事件控制,如果ActionListener不是一个接口,而是一个类,就做不到这一点,因为在java中你不可以写:
class AFrame extends JFrame,ActionListener {

}

#2


"我觉得没有接口也一样编程啊"可以这么说,没错,不过有了接口才真正的使JAVA摆脱了不能多层继承的尴尬!

#3


有了接口才真正的使JAVA摆脱了不能多层继承的尴尬! ---  话没有错,但是不可以自己去扩冲一个类吗?反正接口里的的方法还要自己去实现的。

#4


那有了接口你不觉得方便了项目的管理吗!?
比如在一个多语言的网站中,需要根据用户使用的语言不同来使用不同的页,这时候需要转换编码方式的函数,(假如每个小组开发一种语言部分)编码转换的函数在JAVA BEAN 中如果每个小组在BEAN中的转化函数名字都不一样就为以后的程序维护增添很多的麻烦,而如果用了接口呢大家的BEAN都继承这个接口只需要重写方法就可以了方法名也不就统一了吗?!
当然这个例子并不能完全说明借口的优势,但就凭这一点我们也应该看到了借口的价值了,不是吗?!

#5


我们可以全部都用抽象类,但这样就没法多重继承并且系统不够灵活。
在《hinking in java》里有句话“尽可能地使用接口(相对抽象类)”

#6


我觉得最重要的原因不是为了多重继承!
过多地使用多重继承会使问题无限复杂化,应该少用
这也是Java没有多重继承的原因,虽然利用接口可以变相地实现多重继承
我认为真正的原因是为了"上溯造型"!使接口的子类能够接收和处理父类的消息
从而能够被接口对象的一个实例调用,不用去关心子类的具体类型。
我说的不是很清楚,不过这在"Thinking In Java"里有非常清楚的解释,可以去看看

#7


接口是实现回调函数的好方法..

#8


多重继承吧?

#9


同意magiccode(magiccode)的观点

#10


从设计可重用的程序来谈,更多的使用接口要比继承更好。

对接口的继承体现不同的实现,在出现修改需求的时候只需要增加新的类实现原来的接口就行了,而在继承中往往会涉及多个类的修改。

#11


管理上是方便了  但是没有接口从技术上说也不是不可以

#12




俺做framework
程序中只有Interface没有class

#13


回复人: samwong(啊曲) (2002-2-2 20:01:47)  得0分 
接口是实现回调函数的好方法..  


是这样吗??不是,我认为内部类才是解决C++中callback的(因为在java中没有函数指针。)

#14


大家都说到了interface能应用到的许多地方了。
可能更多的用OO的思想编程的人,才能更深体会到interface的妙处!
http://www.artima.com/interfacedesign/index.html

学习中..

#15


这到也是  偶考noi的时候只有面向结构  没有OO 

#16


to: aprim(四楞子)
天呀..这里是Java论坛..请你多了解java吧!!!
我想先说:java中虽然没有函数指针的概念引入..但是指针是存在的.
就是我们说的对象的方法.对象本身是引用的.也就是指针的概念.

Javak中,接口是实现回调函数的首选方式之一.我想用一个例子来说; 这是摘自Java2核心技术Volume I.

class Timer extends Thread
  {...
    {public void run()
      {while (true)
       {   sleep(delay);
           //now what?
        }
      }
   }

interface TimerListener
{public void timeElapsed(Timer t);
}

class AlarmClock implements TimerListener
{AlarmClock()
{Timer t=nre Timer(this);
t.setDelay(1000);//1000 milliseconds
}
public void timeElapsed(Timer t)
{ if(t.getTime()>=wakeUpTime)
  wakeUp.play();
}
}

class Timer extends Thread 
{Timer(TimerListener t){listener =t;}
...
pubilc void run()
{while (true)
{sleep(interval);
listener.timeElapsed(this);
}
}
TimerListener listener;
}

Timer类构建器收到对指定对象的引用,并把它保存在listener变量中.每当既定时间一过,其timeElapsed()方法就会被调用.因为listener对象实现了TimerListener接口,编译器就会知道自已支持的是一个timeElapsed方法.

有关细节请参考"Java2核心技术Volume I" page 163.

 

#17


关注

#18


to:samwong(啊曲)我们现在讨论的可不是接口怎么用,而是讨论接口有什么用!在你贴上来的程序中把TimerListener接口换成抽象类也是可以的,不是吗?对了,另外提醒你,JAVA中可没有回调函数的说法,好象只有回溯哦!
to:magiccode你说的情况在抽象类中也是可以的,所以不具有代表性!(抽象类中也可以实现,回溯哦!)
其实,大家可以把接口看做是比抽象类,还要抽象的对象!(什么方法都没有实现,只是定义了方法体,而抽象类至少还可以定义点方法!)

#19


关注!

#20


to : pengji(彭乃超) 
你的说法有偏差。
1、java中是有回调的。
2、从极端的角度讲,接口使得程序间的耦合度更小,而抽象类是已经定义过方法的,从抽象类基称,就使你需要改变的方法难免会和其他的已定义的方法相牵连。会造成扩展和改动的不便。(当然,不是说extends就不好。很多时候抽象类都是很需要的)

#21


接口他定义了一个标准,通过其不通的实现类,来实现多态的目的。

#22


to:judgement_sword(没什么)
1,谢谢,确实有回调
2,从抽象类基称,就使你需要改变的方法难免会和其他的已定义的方法相牵连。会造成扩展和改动的不便。那如果我写的抽象类中的方法都为抽象的呢!?不就和接口一样了吗?!还会造成扩展和改动的不便吗?!

#23


g z

#24


面向对象编程中,真正是
对接口编程,而不是对类或对象编程。

#25


学习

#26


提出这样的问题的同志,
我不得不说你对oop几乎没有什么概念!
你去看看<design parttens>,
问题迎刃而解。

#27


对程序设计带来了很大灵活性 
"对接口编程"是面向对象设计(OOD)的第一个基本原则 
简单的说,接口就是方法的名字,一个对象跟外界交流的窗口 
也就代表了一个对象有什么功能。 

应用中,你可以把接口当成对象传给需要使用这个对象的代码, 
那么这些代码就可以操纵这个对象了,当你对这个对象的版本不太满意了 
你就只修改这个对象得了,接口不变,方法名字不变,那么外面的代码几乎 
可以完全不变就重用了这个对象。 
"将可变的部分和不可变的部分分离"是面向对象设计的又一个原则 
使用接口你就可以把对象之间的耦合性降低,得到对象的重用性 

#28


当你的项目需要在中国和美国同时开始编程的时候,你就会发现接口的重要性了。
当然,不使用interface也可以实现按接口编程,只要大家约定好,不过这样的话对子系统的测试会有不良的影响。
另外,不知道有多少人在实际的项目里面用到了多重继承,不要举书本上的公鸡母鸡公母鸡。

#29


请问,C++没有接口,若OOD,那只能用虚类和多重继承了?

#30


实现 人妖类 呵呵

#31


接口是一种实现多重继承的妥协的方法.
虽然java的单一继承有它的好处,但这个好处马上就会显得尴尬.
是,不错,java鼓励我们在作设计,实现时面向接口,面向对象也是这样提倡的.
但要知道,最后我们还是要做实现.
举一个例子,企业有人员,我们叫A类.驾驶员我们叫B类,
那你如何来表示企业驾驶员呢?
如果我们认为A,B是接口,好,面向接口编程吗,C implements A,B就行了.
可我们现在要做实现呀,同志们.

最后的这个C你准备怎么做呢?
C extends A ,然后再把B的方法加进来 / C extends B,然后再把A的方法加进来
还是..

我准备放弃java了

#32


咦??

直接 C implements A,B 不就可以了吗??

然后在 C 中实现 A 和 B 的方法。

这样就实现了啊……

有什么问题??

JAVA挺好的,我不准备放弃它^_^

#33


支持GFox(小狐)

#34


菜鸟就是菜鸟,没什么好解释的。

#35


接口和多继承本来就不是一回事。
多继承有利有弊,java中不支持多继承。

接口的目的是为了将定义和实现分离,
这是个很重要的概念,可以看看设计模式。

象回调函数这类动功能也最好由接口来实现。
一个类可以实现多个接口,
这在一定程度上解决了没有多继承的问题
但接口在java中绝不是为了弥补多继承的问题而加入的。

#36


继续关注

#37


接口很好,看一下SUN推出的WebService中的东西就知道了。
在JAXM和JAXP中公开的全部是接口,而不是实现!!
这里的接口绝不是为了多继承,也不是为了回调函数!!!!

#38


在整个面向对象设计领域所遵循的一个设计原则:针对接口编程,而不是针对具体的实现。这个思想可以说是设计模式的基石之一。现在的很多对象模型,比如EJB,COM+等等,无不是遵照这个基本原则来设计的。针对接口编程的好处有很多,通过接口来定义对象的抽象功能,方便实现多态和继承;通过接口来指定对象调用之间的契约,有助于协调对象之间的关系;通过接口来划分对象的职责,有助于寻找对象,等等。

#39


在整个面向对象设计领域所遵循的一个设计原则:针对接口编程,而不是针对具体的实现。这个思想可以说是设计模式的基石之一。现在的很多对象模型,比如EJB,COM+等等,无不是遵照这个基本原则来设计的。针对接口编程的好处有很多,通过接口来定义对象的抽象功能,方便实现多态和继承;通过接口来指定对象调用之间的契约,有助于协调对象之间的关系;通过接口来划分对象的职责,有助于寻找对象,等等。

#40


在整个面向对象设计领域所遵循的一个设计原则:针对接口编程,而不是针对具体的实现。这个思想可以说是设计模式的基石之一。现在的很多对象模型,比如EJB,COM+等等,无不是遵照这个基本原则来设计的。针对接口编程的好处有很多,通过接口来定义对象的抽象功能,方便实现多态和继承;通过接口来指定对象调用之间的契约,有助于协调对象之间的关系;通过接口来划分对象的职责,有助于寻找对象,等等。

#41


所谓的针对接口编程.我们可以理解为是在做设计.
但我想再重申一次,我们最后要做的是实现.
按照 GFox(小狐) 所说的,那A,B的方法我并没有任何方法去重用.
我以为会有人回答说 用聚合而不用继承.可是没有.
但你有机会遇到这类问题时,你就会发现"面向接口编程"是如此的使你处在一个尴尬的境地.

#42


那是因为你在不该用接口的地方用了接口。
请看看《设计模式》即《design patern》

不要把眼光局限在一个很小的程序上,
在那么小的东西里,连类都多余,不用说什么接口了。

#43


biti_9512207(波波斯基):
正如leolee(历历)所说,这不是Java定义接口造成的,而是Java不支持多重继承所造成的。
我认为,为了这个原因放弃Java是不值得的,因为多花10分钟敲击键盘比多花3小时检查access violation总要划算,如果你没有对性能的苛刻要求的话。

#44


Yeah

#45


STUDY

#46


波波斯基,
你完全可以复用A B 的方法。
在很多情况下,继承并不是好的复用代码的方法,多重继承就更不是了。

#47


组件化,EJB,com,dcom。。。这些东西研究一下,你就会发现,没有接口是万万不能的,他是组件化实现的基本手段

#48


接口的作用不在于多重继承的实现。
接口定义了一组规范的服务,不只是java使用接口,corba和com都是使用接口定义语言idl用于定义组件提供的服务。有了预先定义好的接口,不同的服务提供商(spi)可以用不同的方法实现接口,而对于使用服务的程序来说并不需要知道spi的具体实现。很多specification都已接口的方式定义了一组服务,如ldap,xml dom,java jndi

#49


假如继承是为了实现的话,我的看法是不值得将这个作为选择语言的出发点。正如你所说的,有很多办法可以解决这个问题,而这个问题又和interface没有什么关系。

#50


upuupupupup
智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告