我见了很多人在网上问接口的作用,因为要实现它的所有方法感觉很自己重新编写一个类无异,为什么要实现于这个接口呢?他究竟有什么作用呢?
一:接口存在的原因
1)我们生活中就有插口这个词,比如耳机插口,你想用手机听音乐拿出耳机插入手机的耳机插口中,我们将手机和手机的插口一分为二,如图所示:
耳机的接口就是连通耳机和手机的渠道,同样的道理,有很多类的使用必须实现某些接口,比如a类需要实现b接口,那么b接口就是使你在当前状态下可以使用a类对象的渠道。
比如java中的静态排序方法Arrays.sort(),它是个重载的方法,在你只给他数组时它按照默认的方法排序(默认的是什么我也不知道,排序一般我都自己写,没用过它),但是当你传送过去一个Comparator接口实例时,它会按照接口实例给出的排序规则来实现。比如需要排序的是个person对象,他有age,name等等这些域,Arrays.sort()可不知道你想按照什么排序,那么就需要你在实现Comparator实例中告诉它规则。
2)还有一个作用就是实现多继承,在c++等语言中就可以实现多继承,但是会存在很大的问题:菱形继承(如果不懂可以去查看http://www.zhihu.com/question/21476063),所以java摒弃了它,但是接口却可以解决很多多继承能够解决的优点。
比如thread,假如你想让A类继承于thread,那么你可以直接class A extends Thread{},那么A类就会具有thread的特性了,但是偏偏你既想让A类具有Thraed的特性同事又想具有View的特性怎么办?java又不可以多继承,所以你可以class A extends View implements Runnable{} 然后在代码里创建thread对象时 Thread t = new thread(this);这样就可以弥补部分java不能多继承的缺点,当然同样可以使用内部类或者匿名类解决该问题。
二:接口的优点
接口究竟有什么优点使它纯在呢?发现其实它内部是空的,就有个名字…没错,但是就是因为那个名字所以它存在,因为它的名字是个规范,说的通俗点,就是它的名字已经在其他地方使用了。比如,我有一笔遗产,我要传给一个叫做张三的人(假设世人的名字没有重复的,凑活听吧,表达能力不强),有些歹徒想要得到这笔遗产,就需要找个人冒充张三,因为我的遗嘱上写的就是张三,在他们想要的到这笔钱之前就已经写好了。
我们都知道,面向对象的程序语言比面向对象的要功能强大很多,因为很多代码都已经有人替你敲好并且封装好了,你只需要使用就行。比如你想用c编写个排序字符串的函数,你需要写比较规则,处理指针,还有选择排序算法,但是java不用,除了比较规则以外的其他步骤它已经帮你写好了。在使用的时候你可以发现接口一般都是用参数形式传递的,再拿排序的Runnable来说,再thread中需要使用run()方法,无论你传过去Runnable实例与否它都要使用run()方法,如果你把一个叫做norun()的方法给它,他根本不能用啊,为了防止你胡乱命名,所以接口就诞生了。
转载请注明出处:http://blog.csdn.net/dangxw_/article/details/10180017