一、为什么项目中需要使用接口?
在项目中,有一些功能,不仅仅是一个类去实现,即有很多地方有用到,大家需要统一标准。所以需要用接口,这样大家同时实现一个接口,就能够统一规范。在接口中只是定义了基本的方法名,具体的实现交给实现类。
统一标准之后的下一件事情,就是多态。多态的实现,是使用了动态绑定技术,这里不做进一步展开。只需要知道在C和C++中,是前期绑定,也就是在编译前,就已经知道了具体执行哪些代码;而在java中,是后期绑定或者说是动态绑定,也就是在程序执行的那一刻,才会知道执行什么代码。而动态绑定技术,是实现多态的重要条件。
统一标准后,父类声明,子类实例化,调用接口方法,就可以产生不同的结果。比如手机和电视都实现了播放功能。这个时候:
Usb u1=new Phone();
Usb u2=new Tv();
u2.play();
这个时候控制台输出的就是不同的语句了,u1输出手机播放的方法,u2输出电视的播放方法。
我们来想一想,这样做有什么好处?
1.代码简洁
如果我有100个播放设备,那么只要继承Usb接口,实现play()方法,并且按照上述的方式去调用,就可以得到不同的效果;如果我们不实现接口,而是仅仅在类里面自己写play方法,那么我们调用的时候就需要指名具体是哪一个类,而程序运行的时候如果不能明确写明是哪一个类,处理起来就非常麻烦。
2.实现可以多种多样&维护成本低
再比如,有一个叫comparable的接口。数字可以比较,那么自定义的类怎么比较呢?实现了接口,我们就可以用实现类去实例化父类的comparable接口,直接调用compareTo方法比较即可(正面);如果我们不用,那么在写代码的时候就要自己记住去写compareTo方法,并且调用的时候,直接指定清楚类名。并且,如果有100个类都需要比较,人会犯错,可能别人写的不是compareTo方法,而是改了个名字,可能别人比较不再是规定好的返回boolean类型的结果,可能。。。。这样就给代码的迭代、维护带来很高的成本。
3.降低代码的耦合性
假设张三、李四同时开发一个模块。张三负责写收银员类和方法,李四负责写计算器类和方法。如果没有接口,那么张三写好了之后,需要调用李四的方法,想当然的认为方法名是jisuan(),结果却发现李四的方法名是countMoney(),这个时候就需要去修改代码了,带来了不必要的麻烦(反面)。
如果在工作刚刚开始的时候,张三提前想到了这一步,规定了,李四,你写计算器类的时候,需要实现我的Icount接口,接口中规定了你需要实现一个计算的方法,按照我的方法名,和返回类型,返回给我正确的方法,我直接在我的代码中调用即可。
综上所述,接口是有很多好处的。接下来,我们应该如何理解接口呢?
二、接口的理解
1.接口就是个招牌
比如说你今年放假出去杭州旅游,玩了一上午,你也有点饿了,突然看到前面有个店子,上面挂着KFC,然后你就知道今天中饭有着落了。
KFC就是接口,我们看到了这个接口,就知道这个店会卖炸鸡腿(实现接口)。
那么为什么我们要去定义一个接口呢?这个店可以直接卖炸鸡腿啊(直接写实现方法),是的,这个店可以直接卖炸鸡腿,但没有挂KFC的招牌,我们就不能直接简单粗暴的冲进去叫服务员给两个炸鸡腿了。
要么,我们就要进去问,你这里卖不卖炸鸡腿啊,卖不卖汉堡啊,卖不卖圣代啊(这就是反射)。很显然,这样一家家的问实在是非常麻烦(反射性能很差)。
要么,我们就要记住,中山路108号卖炸鸡,黄山路45号卖炸鸡(硬编码),很显然这样我们要记住的很多很多东西(代码量剧增),而且,如果有新的店卖炸鸡腿,我们也不可能知道(不利于扩展)。
2.接口在日常生活中的映射
日常生活中,两个实体之间进行连接的部分称为接口。如电脑和U盘连接的标准USB接口。接口可以确保不同实体之间的顺利连接。如不同的电脑厂家和U盘厂家只要按照相同的USB接口进行生产,那么所有的电脑和U盘就可以顺利的连接起来。