最近一直在闷头往前看《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. 修改JVM的参数、Jstat、Jstack、gclog

    ---恢复内容开始--- 1. jetty 修改JVM的参数 deploy/bin/env.sh 在上面的环境变量脚本中进行修改:如果分配给JVM的内存是4g 这个里面的JAVA_OPTS 的配置项就 ...

  2. Exchange 邮件服务器内存硬盘估算

  3. angular controller与directive相互引用

    /** * Created by Administrator on 2017/8/28. */ var app =angular.module('app',[]); app.directive('fo ...

  4. .NET重构(三):在注册和充值中,触发器的使用

    导读:机房做到注册和充值了,有两个关键点:在注册的时候,同时给该用户写入充值记录:在充值的时候,给该用户更改余额信息.第一次做的时候,是一条一条的写,那时候师傅就说了触发器和存储过程的使用,现在终于用 ...

  5. BZOJ 4815 [Cqoi2017]小Q的表格 ——欧拉函数

    把式子化简一波. 发现一个比较厉害的性质:每个点只能影响到行列下标$gcd$与它相同的点. 然后就可以计算$\sum_{g<=k}f(g,g)*\sum_{i<=k}\sum_{j< ...

  6. [TyvjP1519] 博彩游戏(AC自动机 + DP)

    传送门 和bzoj1030一个德性 #include <queue> #include <cstdio> #include <cstring> #define N ...

  7. @Java web程序员,在保留现场,服务不重启的情况下,执行我们的调试代码(JSP 方式)

    一.前言 类加载器实战系列的第六篇(悄悄跟你说,这篇比较水),前面5篇在这里: 实战分析Tomcat的类加载器结构(使用Eclipse MAT验证) 还是Tomcat,关于类加载器的趣味实验 了不得, ...

  8. *AtCoder Grand Contest 002F - Leftmost Ball

    $n \leq 2000,k \leq 2000$,现$n$种球每种有$k$个,在一种排列中,会把每种颜色的球第一个出现的涂成第0种(不同于原来的n种)颜色,问最终会出现多少种不同的序列.膜1e9+7 ...

  9. 玩具装箱 BZOJ 1010

    玩具装箱 [问题描述] P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1... ...

  10. Xcode打包应用为ipa

    Xcode教程 Xcode4发布测试 打包Archive操作是本文要介绍的内容,发布测试的最后一步打包(Archive),Xcode4帮助文档有比较详细介绍,但是居然是错的,这里说明一下. 1.设置& ...