从JDK1.8开始,Java中引入了一些新功能,而其中很多功能都是为了接口而设计的,下面我们来看看接口的一些新功能。
1、可以在接口中定义用default修饰的普通方法,可以在实现它的子类中覆写。
看例子:
interface Ime{
public default void fun() {
System.out.println(1);
}
void fun1();
}
class Imeage implements Ime{
public void fun() {
System.out.println("fun");
}
@Override
public void fun1() {
System.out.println(10);
}
}
public class Test{
public static void main(String[] args) {
Ime a = new Imeage();
a.fun();
a.fun1();
}
}
结果是:
fun
10
如果在子类中不对fun()方法进行覆写,则结果是:
1
10
2.可以在接口中定义静态方法,由类名直接调用。
看例子:
interface Ime{
public static void fun() {
System.out.println(3);
}
void fun1();
}
public class Test{
public static void main(String[] args) {
Ime.fun();
}
}
结果:3
由以上两点可以看到接口和抽象类的区别已经基本消弭,最主要的区别就是抽象类用于单继承,而接口可以实现多继承。
3.Lambda表达式
在JDK的1.8更新中同样引进了函数编程的概念,使用它设计的代码会更加简洁。当开发者在编写Lambda表达式时,也会随之被编译成一个函数式接口。
Lambda表达式实现的要求:接口中只能有一个方法。一般用Annotation参数 @FunctionalInterface声明。
看例子:
@FunctionalInterface
interface Ime{
void fun();
}
public class Test{
public static void main(String[] args) {
Ime a = ()->System.out.println("Lambda");
a.fun();
}
}
结果:Lambda
如果需要执行多条语句时:
public class Test{
public static void main(String[] args) {
Ime a = ()->{System.out.println("Lambda");
System.out.println("!!!");
};
a.fun1();
}
}
结果:
Lambda
!!!
如果方法是进行数据的返回,可以不用写return。
看例子:
@FunctionalInterface
interface Ime{
int add(int x, int y);
}
public class Test{
public static void main(String[] args) {
Ime a = (x, y) -> x + y;
System.out.println(a.add(10, 20));
}
}
结果是:30