java接口的一些想法
最近一直在闷头往前看《thingking in java》 ,但是却由于赶了进度而忘记了初衷。当学到集合的时候,回头却发现,我连最基本的接口都不明白。查了一上午资料,现在明白例如一点点,写个备忘录吧,供以后修改和查看。
接口是什么?
我觉着《thingking in java》中的定义非常好,所谓接口,就是一个更高层次上的抽象,通过关键字interface产生一个完全抽象的类,不提供任何实现,只提供形式。所有与接口通讯的类只需知道接口中有什么样的方法存在即可,无需知晓其他问题. 这就类似于是一种协议,一种标准,“所有实现了该接口的类看起来都是这个样子”。
接口有哪些作用?
- 实现多重继承,或者说是实现伪多重继承,因为java是单根继承,只能通过实现多个接口来模拟C++中的多重继承。一个类通过向上转型成不同的接口,来实现类似于多重继承一样的特性(以及由此带来的灵活性)。
- 降低耦合度,或者说实现完全解耦(当然真正的完全解耦是做不到的),提高代码的复用性。 比如,如果某个方法操作的是某个类而非接口,那么这个方法只能使用这个类及其子类,而往往一个方法只会使用到一个类的某一个特性,而其他不在这个类继承体系内但也具有相似特性的类就不能被这个方法所使用。 而接口则完全克服了这个弊端,只要是实现了我的接口,就可以被这个方法调用。代码就不写了,我觉着《thingking in java》中所举出的例子非常好。
- 由前两点就可以引出不算第三点的第三点,接口的作用是一种标准,一种约束,通过接口,可以实现逻辑和具体实现分离。我们在使用接口的时候,可以不用关心具体的实现,因为只要是遵循我们接口的具体实现都可以使用。比如,java的JDBC和java web的那一系列的接口,sun公司定义了一套完整的JDBC接口,供厂商去实现,而数据库试用者则完全不需要了解某个具体的数据库产品是如何实现的,只要调用JDBC接口就好了;当我们的数据库更换时,只要改变一下所要加载的驱动就好了,而无需改变程序中的其他部分,降低了逻辑与具体实现的耦合度,从而提升了代码的复用性。java web也是如此,开发者按照接口去实现自己的软件,而tomcat却无需知道你是如何实现的,只要调用相应的接口就能调用不同的servlet(这些都是个人的想法,不一定完全正确)
如何在正确的地方中使用接口和抽象类?
说实话,如何正确使用接口和抽象类,还有继承组合等等这些,需要大量的代码积累和经验的总结。而我目前只是个学生,从入学到现在写的java代码总行数不超过5w行,写这个完全是为了今后能够慢慢地积累,没有任何的经验只谈。
接口个人觉着就是具有某种功能对象集合的抽象,强调的是功能上的一致。而抽象类则是某一种对象的抽象,强调的是种类上的一致。比如flyable接口就是对具有fly功能对象的一种抽象,如果定义成flyable抽象类,就感觉有些不恰当,毕竟飞机,飞鸟,飞鱼不是同一种对象,而他们之间相同的仅仅是fly这一种功能。抽象类和类一样,是某一种对象,这个对象一定具有某些属性,而不同子类具有不同的表象而已,比如不同地域的人,大家都是人对象,只是所处的地方不同,将这些人抽象出来,就是一个抽象人类。如果把这个抽象的人类定义成一个接口,让不同地方的人实现这个接口,那么一些共性的方法或者特点就要多次重写,这与面向对象的思想相违背(具体是哪一种实在是想不起来了)。
说到底,接口和抽象类之间的区别就是 接口是一种“is like”的关系,而抽象类是一种“is a”的关系。
更加深层次的想法,暂时是想不到了,日后一点一点积累吧。
《thinking in java》中有一段话感觉简单而直接:
如果要创建不带任何方法定义和成员变量的基类,那么就应该选择接口而不是抽象类. 事实上, 如果知道某事物应该成为一个基类, 那么第一选择是使它成为接口
任何的抽象性都应该是应真正的需求而产生的。当必须的时候,应该重构接口而不是到处添加额外级别的间接性。
恰当的原则应该是优先选择类而不是接口。从类开始,如果接口的必须性变得非常明确,那么就应该进行重构。
为什么接口中的域或者说属性都必须是static 和 final 类型的呢?
我很疑惑这个问题, 网上几位前辈给了一个回答, 感觉比较中肯, 写下来备忘
由于接口只是用来描述一个对象有哪些方法的,所以接口不应该涉及任何数据相关的东西. 也就是接口中的属性是多余的, 允许存在public static final 类型的属性, 是因为他的存在不影响接口的作用, 常量表达式会在编译器就被替换成对应的常量值.
//大家接口的讨论 :http://bbs.csdn.net/topics/390200240
//接口和抽象类之间的区别:http://dev.yesky.com/436/7581936.shtml#pl
//java 接口的变量为什么是static 和final类型的呢? : http://segmentfault.com/q/1010000002628913
//thinking in java笔记,如果有不对的地方,还望指正^_^