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开发:网络编程
Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的全部方法. 高级别的网络 ...
- BNUOJ 4215 最长公共连续子序列
最长公共连续子序列 Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld Java class ...
- 九度oj 题目1335:闯迷宫
题目描述: sun所在学校每年都要举行电脑节,今年电脑节有一个新的趣味比赛项目叫做闯迷宫.sun的室友在帮电脑节设计迷宫,所以室友就请sun帮忙计算下走出迷宫的最少步数. 知道了最少步数就可以辅助控制 ...
- MySQL容量规划之tcpcopy应用之道
官方文档:https://github.com/session-replay-tools/mysql-replay-module tcpcopy可以将正式环境上来自客户端的请求复制一份到测试端并复现, ...
- [luoguP2325] [SCOI2005]王室联邦(树分块乱搞)
传送门 想了半小时,没什么思路.. 看了题解,是个叫做树分块的奇奇怪怪的操作.. 题解 树分块的研究 #include <cstdio> #include <cstring> ...
- cf575A Fibonotci
Fibonotci sequence is an integer recursive sequence defined by the recurrence relation Fn = sn - 1·F ...
- testng自定义html报告,根据freemaker生成
[转] https://testerhome.com/topics/3487 [参考]https://www.cnblogs.com/cheese320/p/8890929.html 做了些修改,换 ...
- 虚拟机搭建--hyper-V使用教程
http://jingyan.baidu.com/article/4e5b3e19695d9f91901e24bb.html
- POJ 2002 Squares [hash]
Squares Time Limit: 3500MS Memory Limit: 65536K Total Submissions: 16631 Accepted: 6328 Descript ...
- linux的at定时任务的使用
linux的at定时任务的使用 使用at只能执行一次性任务:使用at命令需要开启atd进程. 以下情况需要安装at命令: 情况1.查看是否开启atd进程:ps -ef | grep atd.[test ...