接口的其他细节——第一点JDK8以后是新增的三个接口内的方法,第二是接口的多继承,最后是了解一下接口使用时的注意事项。
三个新方法
注意:接口内的实例方法因为是对象的方法,而接口本身不能创建对象,所以需要通过实现类的对象来访问。
默认方法
- 使用default修饰的接口内方法,且默认会被public修饰
可以拥有方法体,在接口内也相当于实例方法。
例如:
package user.interfaceDemo; public interface A { default void test1(){ //等同于 public default void test1(){} System.out.println("默认方法"); } }
私有方法
- 必须使用private修饰的方法(JDK 8 开始才支持的)
与默认方法一样,也可以拥有方法体,但不能被外部访问,只能在内部进行访问。
例如:
package user.interfaceDemo; public interface A { default void test1(){ //等同于 public default void test1(){} System.out.println("==默认方法=="); test2(); } private void test2(){ System.out.println("==私有方法=="); } }
静态方法
- 必须使用static修饰的方法,默认会被public修饰
package user.interfaceDemo; public interface A { static void test3(){ System.out.println("==静态方法=="); } }
JDK8开始,接口中为啥要新增这些方法?
- 增强接口的能力,更便于项目的扩展和维护
- 例如某些情况下,一个接口被很多的类实现了,此时给接口添加一个新方法的话,所有实现了这个接口的类都要去一个一个地重写这个新方法;需求中如果只是单独的一个类或少数的类需要重写该方法,那么就可以使用这些新方法。
接口的多继承
- 一个接口可以同时继承多个接口
public interface C extends B,A{ }
接口多继承的作用:
- 便于实现类去实现
例如:
interface B{ void test1(); } interface C{ void test2(); } interface D{} interface E extends B,C{} class c implements E{ @Override public void test1() { } @Override public void test2() { } }
使用接口的注意事项【了解】
- 一个接口继承多个接口,如果多个接口中存在方法签名冲突,则此时不支持多继承。
- 一个类实现多个接口,如果多个接口中存在方法签名冲突,则此时不支持多实现。
- 一个类继承了父类,又同时实现了接口,父类中和接口中有同名的默认方法,实现类会优先用父类的。
- 一个类实现了多个接口,多个接口中存在同名的默认方法,可以不冲突,这个类重写该方法即可。
END