定义
接口描述的是一组需求,也就是一个类想要符合这个接口就必须满足这些需求,具体来讲就是实现这个接口中的方法。想要某个对象获得某个服务,就必须让该对象所属的类实现对应的接口,也就是该服务需要调用接口中的方法才能给你提供你想要的服务,那么你的类就必须实现这个方法(实现接口),否则没法提供服务。通俗的讲就是你的类必须符合(实现)这个特定的接口,我才能够给你提供服务。
特性
- 方法都是public方法,默认是public,声明时不要提供。
- 接口中没有实例字段(成员变量),但可以包含常量。
- 接口之间允许多继承(extends),一个类可以实现多个接口(implements),用逗号分隔多个接口。
- 无法通过new运算发构造接口对象实例,但是可以声明接口变量来引用实现该接口的类的对象。
- 接口中的字段默认是public static final 修饰。也就是常量。
- 接口中可以包含抽象方法和具体实现的方法。
- 抽象方法默认是public abstract修饰。
- 静态方法可以具体实现,public static 修饰。
- private修饰的方法可以是静态或实例方法,都是具体实现并且只能在接口中使用(private的),作为其他方法的辅助方法。
- 私有方法和公共静态方法不能被实现类覆盖。
- default(默认)修饰的方法必须具体实现,默认方法中可以调用其他方法。default方法只能在接口中实现不能被实现类覆盖。
默认方法冲突
有时候一个接口定义了一个默认方法,超类或者另外一个接口也定义了一个同样的方法,那么实现类该如何选择?
- 超类优先原则,一个类继承了一个超类和一个或多个接口,在接口中定义了一个默认方法,超类中也实现了同样的方法,那么始终都是继承超类的方法,接口的方法会被忽略。
- 重新覆盖该方法,两个或者多个接口实现了同样的默认方法,那么就必须重新覆盖这个默认方法(这里可以覆盖),如果一个接口实现了默认方法,另外的接口只是定义了相同的方法没有实现,那么也得在实现类中重新覆盖。