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笔记,如果有不对的地方,还望指正^_^
java接口的一些想法的更多相关文章
- 获取Java接口的所有实现类
获取Java接口的所有实现类 前言:想看基于spring 的最简单实现方法,请直接看 第七步. 本文价值在于 包扫描的原理探究和实现 一.背景 项目开发中,使用Netty做服务端,保持长连接与客户端( ...
- Java接口和抽象类有什么区别,哪些时候用接口,哪些时候用抽象类?
Java接口和抽象类有什么区别,哪些时候用接口,哪些时候用抽象类? 2013-01-05 17:16:09| 分类: JAVA | 标签:java |举报|字号 订阅 下面比较一下两者的 ...
- java接口调用——webservice就是一个RPC而已
很多新手一听到接口就蒙逼,不知道接口是什么!其实接口就是RPC,通过远程访问别的程序提供的方法,然后获得该方法执行的接口,而不需要在本地执行该方法.就是本地方法调用的升级版而已,我明天会上一篇如何通过 ...
- java 接口的作用和好处
1.java 接口的作用 http://blog.csdn.net/hack_bug/article/details/7634737 2.一位Java大牛的回答 很多JAVA初级程序员对于接口存在的意 ...
- java接口
一.定义 Java接口(Interface),是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为( ...
- java接口的嵌套
java接口 1.接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值 2.接口中的方法默认都是 public abstract ...
- java 接口和抽象类的区别
java 接口和抽象类的区别抽象类:1.含有抽象方法的类一定为抽象类,反过来抽象类,不一定含有抽象方法:2.抽象类必须用abstract来进行定义,抽象方法也必须用abstract来进行定义:3.抽象 ...
- java 接口(上)
1.接口中的方法都是抽象方法.而普通的抽象类里面不一定都是抽象方法.抽象类中必须有抽象方法,同时也可以有非抽象方法.继承抽象父类的子类中,如果依然有抽象方法,那么这个子类也是抽象类.即只要类中有抽象方 ...
- java接口和抽象类
关于接口 1.创建一个接口,需要使用interface关键字. 2.实现一个接口,需要使用implements关键字. 3.接口的成员属性都是静态常量(默认public static final). ...
随机推荐
- Python requests模块params、data、json的区别
json和dict对比 json的key只能是字符串,python的dict可以是任何可hash对象(hashtable type): json的key可以是有序.重复的:dict的key不可以重复. ...
- SQL server 数据库备份至服务器本地磁盘和其他服务器磁盘
前言 因工作需要将数据库每日备份至服务器本地磁盘和其他服务器磁盘,对网上的例子进行改造,解决了SQL server数据库备份的问题. 一.将指定数据库备份到本地 将数据库affair_stydy全备份 ...
- Flutter 发布APK时进行代码/资源混淆的坑
Flutter 发布APK时进行代码/资源混淆的坑 @author ixenos 1. 关键点 proguard是Java的代码混淆工具,但是当用第三方库的时候,必须要告诉proguard不要检查,因 ...
- hdu_2092_整数解
枚举 #include <iostream> #include <cstdio> #include <cmath> using namespace std; int ...
- hdu6071[最短路+解不等式] 2017多校4
求出所有,从2走到x所需的花费在对 t = 2*min(d1,2, d2,3) 模运算下, 所有剩余系的最短路即可(把一个点拆成 t 个点, 每个点代表一种剩余系), 知道了所有剩余系就可以凑出答案 ...
- 【bzoj4605】崂山白花蛇草水 权值线段树套KD-tree
题目描述 神犇Aleph在SDOI Round2前立了一个flag:如果进了省队,就现场直播喝崂山白花蛇草水.凭借着神犇Aleph的实力,他轻松地进了山东省省队,现在便是他履行诺言的时候了.蒟蒻Bob ...
- BZOJ 1012 [JSOI2008]最大数maxnumber【线段树】
水题,每次记录一下当前有多少个数,然后按照题目所指示的那样模拟就行,每次向线段树末尾插入(其实是修改)题目中指定的数,然后询问当前的个数到前面Q个数中最大值是多少结果就是,好久不碰线段树了,用数组模拟 ...
- 请问 内网的 dns服务器 为什么和 外网的dns服务器 一样??
公司内的内网使用192.169.X.X的内网地址,但是在DNS段填写的是210.34.X.X,显然这是一个公网固定IP,我不明白的是:为什么内部网客户端使用的DNS服务器是公网上的IP呢?内网客户端能 ...
- websql使用实例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- OTOCI(bzoj 1180)
Description 给出n个结点以及每个点初始时对应的权值wi.起始时点与点之间没有连边.有3类操作: 1.bridge A B:询问结点A与结点B是否连通.如果是则输出“no”.否则输出“yes ...