接口新特性
可以提升代码的复用性,减少冗余
JDK8中接口的新特性主要可以允许调用默认方法和静态方法;JDK9中接口的新特性为可以运行调用私有方法供本类方法使用
JDK8新特性
接口中可以定义有方法体的方法(默认或静态)
允许调用默认方法
作用是解决接口升级的问题
允许在接口中定义非抽象方法,但是需要使用关键字default修饰
public class JDK8 {public static void main(String[] args) {InterNet1 interNet1 = new InterNet1();InterNet2 interNet2 = new InterNet2();interNet1.method();interNet2.method();}
}
interface Inter{void show();void print();//升级接口public default void method(){System.out.println("Inter method...");}
}
class InterNet1 implements Inter{@Overridepublic void show() {System.out.println("show111...");}@Overridepublic void print() {System.out.println("print111...");}
}
class InterNet2 implements Inter{@Overridepublic void show() {System.out.println("show222...");}@Overridepublic void print() {System.out.println("print222");}
}
比如这个代码是V2.0版本,使用JDK8的新特性就可以添加默认方法让子类调用,从而不需要修改实现类就可以升级接口。
实现类也可以重写接口的默认方法
package com.itheima.JdkNew;public class JDK8 {public static void main(String[] args) {InterNet1 interNet1 = new InterNet1();InterNet2 interNet2 = new InterNet2();interNet1.method();interNet2.method();}
}
interface Inter{void show();void print();//升级接口public default void method(){System.out.println("Inter method...");}
}
class InterNet1 implements Inter{@Overridepublic void method() {System.out.println("111 method...");//Inter.super.method();}@Overridepublic void show() {}@Overridepublic void print() {}
}
class InterNet2 implements Inter{@Overridepublic void show() {}@Overridepublic void print() {}
}
打印为:
111 method...
Inter method... 可以看见第一个实现类已经可以对接口中的默认方法进行重写
其中需要去掉default关键字,且如果要调用接口中的代码,需要用接口名.super
如果实现了多个接口,多个接口中存在相同的默认方法,实现类必须重写默认方法
public class JDK8 {public static void main(String[] args) {InterNet1 interNet1 = new InterNet1();interNet1.method();}
}
interface Inter{void show();void print();//升级接口public default void method(){System.out.println("Inter method...");}
}
interface A{public default void method(){System.out.println("A method...");}
}
class InterNet1 implements Inter,A{@Overridepublic void method() {Inter.super.method();A.super.method();}@Overridepublic void show() {}@Overridepublic void print() {}
}
打印为:
Inter method...
A method... 可以看见在多实现接口的情况下,我们必须在子类重写同名的默认方法,且调用父类时,需要在super前声明接口。
允许调用静态方法
public class JDK8 {public static void main(String[] args) {A.function();}
}interface A{default void method(){System.out.println("A method...");}static void function(){System.out.println("A function...");}
}
public可以省略,static不能省略,只能通过类名调用
JDK9新特性
接口中可以定义私有方法
如果接口当中许多方法都需要同样的实现逻辑,可以编写私有方法方便操作
public class JDK8 {public static void main(String[] args) {InterNet2 obj = new InterNet2();obj.method();obj.function();}
}interface A{default void method(){System.out.println("A method...");printLove();
// System.out.println("love");}default void function(){System.out.println("A function...");printLove();
// System.out.println("love");}private void printLove(){System.out.println("love");}
}
如果接口的方法中有JDK8新特性提出的静态方法,那么我们可以在私有方法的基础上加上static修饰,这样既可以让默认方法使用,也可以让静态方法调用
public class JDK8 {public static void main(String[] args) {InterNet2 obj = new InterNet2();obj.method();A.function();}
}interface A{default void method(){System.out.println("A method...");printLove();
// System.out.println("love");}static void function(){System.out.println("A function...");printLove();
// System.out.println("love");}private static void printLove(){System.out.println("love");}
}