JDK8新特性
jdk8新特性
一、接口增强
1. 接口中的默认方法
1.1 为什么需要默认方法
在jdk8以前的版本,抽象方法只能有静态常量,抽象方法
interface A{
void run();
}
class B implements A{
@override
public void run(){
System.out.println("我是B类的run方法!");
}
}
class C implements A{
@override
public void run(){
System.out.println("我是C类run方法");
}
}
如上代码块,如果这时我们需要业务拓展,在A接口中新增一个方法
interface A{
void run();
void newMethod();
}
class B implements A{
@override
public void run(){
System.out.println("我是B类的run方法!");
}
}
class C implements A{
@override
public void run(){
System.out.println("我是C类run方法");
}
}
这时如果我们不实现我们新增的newMethod就会报错,上面代码块还好,毕竟实现这个接口的类并不多,但是在实际开发中,会有很多很多,如果在jdk8以前我们得一个个的去重写,但在jdk8中新增了默认方法的概念
1.2 接口默认方法的写法
interface A{
/*
*默认方法的语法
*/
访问修饰符 default 返回值类型 方法名(){
System.out.println("Hello,我是默认方法");
}
}
//默认方法不需要重写 当然如果你需求不一样也可以进行重写
class B implements A{
}
1.3接口中默认方法的使用
- 实例化对象调用
interface A{
public default String getSomething(){
System.out.println("默认方法被调用");
return "你好啊";
}
}
class B implements A{
}
class Test{
public static void main(String args[]) {
A a = new B();
System.out.println(a.getSomething);
}
}
- 实现类重写接口的方法
interface A{
public default String getSomething(){
System.out.println("默认方法被调用");
return "你好啊";
}
}
class B implements A{
@override
public String getSomething(){
System.out.println("我是被重写的默认方法!");
return "我是B类中的默认方法";
}
}
class Test{
public static void main(String args[]) {
A a = new B();
System.out.println(a.getSomething);
}
}
2、接口静态方法
2.1语法规则
interface A{
//只能通过接口类型调用
访问修饰符 static 返回值类型 方法名(){
方法体
}
}
接口中的静态方法是不能被实现类重写的,调用的话只能通过接口类型来调用:A.静态方法()
所以在进行扩展时可以把不允许被子类重写的方法写成静态方法
2.2两者区别
- 默认方法可以通过实例调用,静态方法通过接口名调用
- 默认方法可以被继承,实现类可以调用默认方法也可以重写默认方法
- 静态方法不可以被继承,实现类不能重写接口中的静态方法,只能使用接口名来调用
3.函数式接口
3.1由来
我们知道使用lambda表达式的前提是需要有函数式接口,而我们使用lambda表达式不需要关心接口名,抽象方法名,只需要关注参数列表和返回值类型。