关于接口interface的一些小总结、问题。请求解答和更正。

1,有的接口,加上个 实现就能用里面的方法,不用自己去实现。这大概是个什么原理?
A继承B,B实现C的过程,在这个过程中,A成为了B的子类,B可以替子类实现C接口的某些方法,如果B没有实现,那么就需要A来实现
2,接口和抽象类是抽象类型定义的两种机制,其赋予java强大的面向对象能力,为甚?
(封装,继承,多态,,,,抽象)
3,合作,类似协议,如果针对一个比较庞大的项目,架构师可以李青业务定义接口,由别人去实 现。 定义好一个接口,文档(实现类的命名规范等,)给别人去开发、实现。
4,扩展性,需求变更后,通过接口去改或新建其实现类, 然后,从新引用实现接口的类
5,解耦,,具体是怎么达到解耦的效果的?
6,招牌,通过接口,快速的指导类的作用、用途等。
7,通过接口能更好的实现对开闭原则,修改的关闭,拓展的开放。

第二条,第五条求解答,其他的如有错误请更正!

接口不能实现方法,抽象类可以,从抽象类派生的类如果在基类实现了接口的方法,不用再次实现就可以。
接口和抽象类在底层实现上有根本的区别,实现接口相当于给类型打标签,继承抽象类,则是类的代码和数据的融合。
解耦的意思是,原先你的A类的代码调用另一个类B的代码,那么这两个类是相互依赖的。如果你把A提取出来放在另一个项目中重用,那么还得带上B,反之,你不能随便修改B,因为它会影响A的调用。使用接口,那么A类依赖接口而不是B
那么B或者换一个C、D、E,只要是实现了这个接口,都可以用。A的代码也可以抽取出来拿到另一个项目。举一个例子,现实中,类库有一个Collection,它有一个sort排序的方法,这个方法需要你定义排序规则。
排序规则有很多种,所以你可以定义不同的代码类,只要符合comparable接口就可以。因此sort方法是通用的。因为在项目A中你用一个类实现comparable,在项目B中,你用另一个类实现,sort并不管哪个具体的类。

关于第二点,接口和抽象类的本质区别在于接口不能有方法的默认实现(这在java8中被打破了),抽象类可以用来作为一组接口的默认实现。一般,我们会把接口分的非常细,接口中定义操作(所谓协议),而,抽象类可以作为一组接口的组合,在其中可以有一些默认实现。我们去实现接口(implements),必须实现接口声明的所有抽象函数。去继承(extends)抽象类的时候,只需要去覆盖(@Override)我们关心的默认方法。
关于第五点,你没有接触过大型项目不能理解很正常。解耦是相对的,我们通常要做到模块间松耦合(需要解耦),而模块内部可能需要使用更加紧凑的实现来实现(高内聚)。这一点你多写一段时间代码自然就能理解了。
强调一点,这些设计原理中所谓的各种原理啊准则啊,是要辩证的看待的,不要死板硬套的。比如第七点,我们面向接口编程了,接口设计好了,结果这时候发现需要往接口中添加方法的时候(没有谁一开始就能设计一个永远不变的接口),突然发现所有实现了这个接口的类都不得不进行修改,这可就麻烦了。
所以呢,java8采取了一个狡猾的措施,它打破自己之前一直强调的接口中不能有方法的实现这一约定,接口可以通过default关键字来申明和实现一个新的方法。这样,原来的实现这个接口的类不用修改,而且这些类现在直接获得了一个新的拥有默认实现的方法了。