Java程序的接口是将相关方法按照约定组合到一起的方式,实现接口的类必须为接口中定义的每个方法提供一个实现,或从父类中继承它的实现。
Java8允许接口内声明静态方法,还引入了默认方法的功能。默认方法用default修饰。
变更对Java程序的影响大体可以分成三种类型的兼容性:二进制级的兼容,源代码级的兼容以及函数行为的兼容。向接口中添加新方法是二进制级的兼容。二进制级的兼容表示现有的二进制执行文件能无缝持续链接。源代码级的兼容性表示引入变化后,现有的程序依然能成功编译通过。函数行为的兼容性表示变更发生后,程序接受同样的输入能得到同样的结果。
接口包含的方法签名在它的实现类中也可以不提供实现。实际上,缺失的方法实现会作为接口的一部分由实现类继承,而无需由实现类提供。
抽象类和抽象接口的区别
一个类只能继承一个抽象类,但是一个类可以实现多个接口
一个抽象类可以通过实例变量保存一个通用状态,而接口是不可以有实例变量的
默认方法的两种应用场景:可选方法和行为的多继承。
在Java8中,Iterator接口为remobe方法提供了一个默认的实现
代理是创建一个类,通过该类的成员变量直接调用该类的方法。
声明为final的类不能被其它的类继承。
若一个类使用相同的函数签名从多个地方继承了方法,此时应按照如下规则:
类或父类中显式声明的方法优先级最高
若类或父类中没有声明方法,则提供最具体实现的默认方法的接口优先级最高
若冲突依旧无法解决,则只能显示地指定在类中应使用哪个接口中的方法(Java引入了Class.super.method()方法调用父类接口中的方法)
public interface A{ default void hello(){ System.out.println("Hello from A"); } } public interface B{ default void hello(){ System.out.println("Hello from B") } } public class C implements B, A{ void hello(){ B.super.hello(); } }