最近一直在闷头往前看《thingking in java》 ,但是却由于赶了进度而忘记了初衷。当学到集合的时候,回头却发现,我连最基本的接口都不明白。查了一上午资料,现在明白例如一点点,写个备忘录吧,供以后修改和查看。

接口是什么?

  我觉着《thingking in java》中的定义非常好,所谓接口,就是一个更高层次上的抽象,通过关键字interface产生一个完全抽象的类,不提供任何实现,只提供形式。所有与接口通讯的类只需知道接口中有什么样的方法存在即可,无需知晓其他问题. 这就类似于是一种协议,一种标准,“所有实现了该接口的类看起来都是这个样子”。

接口有哪些作用?

  1. 实现多重继承,或者说是实现伪多重继承,因为java是单根继承,只能通过实现多个接口来模拟C++中的多重继承。一个类通过向上转型成不同的接口,来实现类似于多重继承一样的特性(以及由此带来的灵活性)。
  2. 降低耦合度,或者说实现完全解耦(当然真正的完全解耦是做不到的),提高代码的复用性。 比如,如果某个方法操作的是某个类而非接口,那么这个方法只能使用这个类及其子类,而往往一个方法只会使用到一个类的某一个特性,而其他不在这个类继承体系内但也具有相似特性的类就不能被这个方法所使用。 而接口则完全克服了这个弊端,只要是实现了我的接口,就可以被这个方法调用。代码就不写了,我觉着《thingking in java》中所举出的例子非常好。
  3. 由前两点就可以引出不算第三点的第三点,接口的作用是一种标准,一种约束,通过接口,可以实现逻辑和具体实现分离。我们在使用接口的时候,可以不用关心具体的实现,因为只要是遵循我们接口的具体实现都可以使用。比如,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笔记,如果有不对的地方,还望指正^_^

java接口的一些想法的更多相关文章

  1. 获取Java接口的所有实现类

    获取Java接口的所有实现类 前言:想看基于spring 的最简单实现方法,请直接看 第七步. 本文价值在于 包扫描的原理探究和实现 一.背景 项目开发中,使用Netty做服务端,保持长连接与客户端( ...

  2. Java接口和抽象类有什么区别,哪些时候用接口,哪些时候用抽象类?

    Java接口和抽象类有什么区别,哪些时候用接口,哪些时候用抽象类? 2013-01-05 17:16:09|  分类: JAVA |  标签:java  |举报|字号 订阅     下面比较一下两者的 ...

  3. java接口调用——webservice就是一个RPC而已

    很多新手一听到接口就蒙逼,不知道接口是什么!其实接口就是RPC,通过远程访问别的程序提供的方法,然后获得该方法执行的接口,而不需要在本地执行该方法.就是本地方法调用的升级版而已,我明天会上一篇如何通过 ...

  4. java 接口的作用和好处

    1.java 接口的作用 http://blog.csdn.net/hack_bug/article/details/7634737 2.一位Java大牛的回答 很多JAVA初级程序员对于接口存在的意 ...

  5. java接口

    一.定义 Java接口(Interface),是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为( ...

  6. java接口的嵌套

    java接口 1.接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值 2.接口中的方法默认都是 public abstract ...

  7. java 接口和抽象类的区别

    java 接口和抽象类的区别抽象类:1.含有抽象方法的类一定为抽象类,反过来抽象类,不一定含有抽象方法:2.抽象类必须用abstract来进行定义,抽象方法也必须用abstract来进行定义:3.抽象 ...

  8. java 接口(上)

    1.接口中的方法都是抽象方法.而普通的抽象类里面不一定都是抽象方法.抽象类中必须有抽象方法,同时也可以有非抽象方法.继承抽象父类的子类中,如果依然有抽象方法,那么这个子类也是抽象类.即只要类中有抽象方 ...

  9. java接口和抽象类

    关于接口 1.创建一个接口,需要使用interface关键字. 2.实现一个接口,需要使用implements关键字. 3.接口的成员属性都是静态常量(默认public static final). ...

随机推荐

  1. STM32F407 SPI 个人笔记

    概述 SPI ,Serial Peripheral interface,串行外围设备接口 全双工,同步的通信总线,四根线 主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器 ...

  2. Python第三方库之openpyxl(4)

    Python第三方库之openpyxl(4) 2D柱状图 在柱状图中,值被绘制成水平条或竖列. 垂直.水平和堆叠柱状图. 注意:以下设置影响不同的图表类型 1.在垂直和水平条形图之间切换,分别设置为c ...

  3. Unity3D for iOS初级教程:Part 1/3

    转自Unity 3d for ios 这篇文章还可以在这里找到 英语 Learn how to use Unity to make a simple 3D iOS game! 这篇教材是来自教程团队成 ...

  4. HDU 5073 Galaxy ——乱搞

    [题目分析] 练习赛的T1. 只要看懂样例就可以猜结论了. 然后大胆猜测剩下的星星是一段,其余的都移到重心上去. 所以只要把计算的式子变形一下就很好维护了. 居然没有1A [代码] #include ...

  5. 服务器内部转发forward,action到action

    如果request.getRequestDispatcher();中不是页面而是传action的话,参考以下内容修改: web.xml 2.4版本里,默认的filter只拦截request. 如果使用 ...

  6. farm

    farm 时间限制:C/C++ 4秒,其他语言8秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 White Rabbit has ...

  7. Codeforces Round #291 (Div. 2) D. R2D2 and Droid Army [线段树+线性扫一遍]

    传送门 D. R2D2 and Droid Army time limit per test 2 seconds memory limit per test 256 megabytes input s ...

  8. Codeforces Round #265 (Div. 2) C 暴力+ 找规律+ 贪心

    C. No to Palindromes! time limit per test 1 second memory limit per test 256 megabytes input standar ...

  9. svn服务安装与配置

    SVN安装 centos系统下执行yum install subversion 创建项目 svnadmin create dxk-test 创建项目dxk-test 服务配置与权限控制 vim con ...

  10. ci框架——辅助函数

    辅助函数:application/helper下面.命名要求为***_helper.php;这样在调用的时候直接$this->load->helper('***');若想给自定义的辅助函数 ...