为什么要使用默认方法
当我们把一个程序的接口写完后 用其他的类去实现,此时如果程序需要再添加一个抽象方法的时候我们只有两种选择
-
将抽象方法写在原本的接口中 但是这样写会导致其他所有改接口的实现类都需要实现这个抽象方法比较麻烦
-
写另一个接口 让需要的实现类再继承这个接口 但是如果频繁的变动不利于代码的可维护性
package day8; public interface FatherInterface {void say1();void say2();public default void say3(){System.out.println("say3");} }
package day8; public class ImplementInterface implements FatherInterface{@Overridepublic void say1() {System.out.println("ImplementInterface say1");} @Overridepublic void say2() {System.out.println("ImplementInterface say2");} @Overridepublic void say3() {System.out.println("ImplementInterface say3");} }
package day8; public class Test {public static void main(String[] args) {FatherInterface im=new ImplementInterface();im.say1();im.say2();im.say3();} }
其中public default void say3(){ System.out.println("say3"); }是接口的默认方法 实现类可以不实现 也可以实现
使用接口中的默认方法可以实现接口的升级
注意: 默认方法不是抽象方法,,所以不强制被重写,但是可以重写 默认方法中的public可以省略 但是default不可以省略
接口中静态方法和默认方法使用
package day8; public interface FatherInterface {void say1();default void say2(){System.out.println("调用了默认方法");}static void say3(){System.out.println("调用了静态方法");} }
package day8; public class ImplementInterface implements FatherInterface{@Overridepublic void say1() {System.out.println("实现类抽象方法");} }
package day8; public class Test {public static void main(String[] args) {FatherInterface im=new ImplementInterface();im.say1();im.say2();FatherInterface.say3();} }
接口中的静态方法只能通过接口调用 实现类也不能调用
因为当实现类实现多个接口的时候 而这些接口中刚好有重名的静态方法时,程序不知道调用哪一个
注意 默认方法可以调用私有的静态方法和非静态方法 静态方法只能调用私有的静态方法