有很多情形,需要让不同的程序员都遵守某个契约,来约束他们软件的行为
程序员之间无需关心他人是如何实现的,通常来说,这也就是接口的来源
比如各种各样的车在路上行驶,某个公司来定义他们的交通规则,另一个公司则教导他们使用GPS系统查看路况,或者如何使用收音机
公司之间无需关心对方在做什么,实际上每家公司都拥有自己的特殊权利,任何时候都能进行内部运作
Java中的接口跟类相似,也是一个引用类型
接口不能实例化,只能被某个类实现,或被其他接口继承(后面详述)
接口的定义:修饰符,interface,接口名,extends多个接口{}
接口的修饰符跟类一样只有两种,但接口可以继承多个接口
如果定义一个变量的类型是接口,只能用实现了这个接口的类或子类的对象赋值
接口里可以有字段,他们全部只能是public
, static
, 和 final
的,因此也可以不写
接口里可以有abstract方法,default方法和static方法,他们全部只能是public的,因此public可以不写
接口里也可以什么都没有
abstract方法是没有方法体的,不写就默认abstract,在小括号后直接跟的是分号
public interface OperateCar { // constant declarations, if any // method signatures // An enum with values RIGHT, LEFT int turn(Direction direction, double radius, double startSpeed, double endSpeed);
实现他的类需要实现这些方法,不实现的类也是abstract类
default方法和static方法是有方法体的
考虑往一个接口里添加一个方法时,直接添加的话,所有实现这个接口的类都要报错,因为没有实现新加的方法
第1种.可以新建一个接口,继承原来的那个,再另外添加个新方法,这样哪些类可以选择是否换成新的接口,不换也没事
第2种,声明为static方法,其他类可以用接口名直接调用
第3种.可以在原接口里添加新方法,声明为default,并有方法体,有默认实现,其他类会当做自己也有
public interface DoIt { void doSomething(int i, double x); int doSomethingElse(String s); default boolean didItWork(int i, double x, String s) { // Method body } }
他的子类(确切的说是子接口)处理default方法有几种情况:
无视,将会默认继承
不加default,重新声明一次,将变成abstract方法
加default,并覆盖掉,成为新的接口
default方法与lambda expressions( 略)