接口
接口是百分百纯抽象类:只含有抽象方法(无实体)
接口VS抽象类
一、区别
interface:只有方法没有具体实现 方法只能是public或者不写默认为public ;
变量全为final——不可修改。即接口本身的特性规定了只能定义常量,否则实现的子类a改变了其定义的值,那么其他实现类的值都将随之变化,这样就成了抽象类的特征了,失去了接口更高级的抽象意义。
abstract class:方法可以有具体实现,或者是abstract抽象方法
接口就是一个抽象类,没有变量和方法实现。如果一个抽象类所有的方法都是抽象的就可以将此类用接口来定义。
二、优点
interface:主要针对于功能、动作。将拥有这些动作的类实现此接口如:鸟、飞机都能fly();
体现了开闭原则:对修改关闭,对扩展开放;
abstract class:将拥有共同属性 特征的类继承此类,父类中添加新方法时子类将全部拥有而不用逐一去新增。
当子类拥有父类中的特性是便可以去extends,体现了代码的复用性。继承——灵活性;实现——严谨性;
原文:https://blog.csdn.net/sawelly/article/details/50623978
定义一个接口
[修饰符] interface 接口名 [extends 父接口名列表]{ //可以继承父接口
[public] [static] [final] 常量;
[public] [abstract] 方法; //抽象方法,无实体
}
与Java的类文件一样,接口文件的文件名必须与接口名相同。
实现一个接口(implement)
[修饰符] class <类名> [extends 父类名] [implements 接口列表]{ //可以实现多个接口
}
在类中实现接口时,方法的名字、返回值类型、参数的个数及类型必须与接口中的完全一致,并且必须实现接口中的所有方法。
在类的继承中,只能做单重继承,而实现接口时,一次则可以实现多个接口,每个接口间使用逗号“,”分隔。这时就可能出现常量或方法名冲突的情况,解决该问题时,如果常量冲突,则需要明确指定常量的接口,这可以通过“接口名.常量”实现。如果出现方法冲突时,则只要实现一个方法就可以了。
注:尽可能提高程序的抽象性,并减少方法之间的相互依赖,否则在子类继承重写之后就会出错。
Invokevirtual vs invokeinterface (调用)
A benchmark code to compare invokevirtual with invokeinterface performance. invokeinterface is 38% slower.
default method (缺省方法)
在 java 8 之前,接⼝与其实现类之间的 耦合度 太⾼了(tightly coupled),当需要为⼀个接⼝添加⽅法时,所有的实现类都必须随之修改。默认⽅法解决了这个问题,它可以为接⼝添加新的⽅法,⽽不会破坏已有的接⼝的实现。这在 lambda 表达式作为 java 8 语⾔的重要特性⽽出现之际,为升级旧接⼝且保持向后兼容(backward compatibility)提供了途径。