java8新特性-接口默认方法

前言

3月18日,Oracle公司发布了java8,同时jdk8也发布了。java8增加了一些新特性和增了一些特性。

其中之一是默认方法(Default Methods),这里的默认方法是指的是接口里面定义的方法,可以添加默认的实现

在没有默认方法的时候

如果我们修改了项目中的接口的话,所有实现该接口的类都要发生变化,对于庞大的项目,这几乎是不能忍受的。而默认方法的出现,为我们扩展项目中的接口提供了可能,因为接口中的默认方法,不会强制要求实现类去重写默认方法,也就是不会对系统原有代码产生影响,这应该才是默认方法最大的意义。

在jdk8之前,接口里面只能定义未实现的方法,由实现接口的类来完成方法的实现代码。

而在jdk8中

通过default关键字,可以为方法添加默认的实现,在调用实现该接口的类时,可以直接调用默认方法,而实现类中可以不重写默认方法;当然,你也可以按以前的方式重写接口里面的实现。下面以代码实践来理解

1. jdk8之前,实现类必须重写接口里的方法

1
2
3
4
5
6
7
8
9
10
11
12
package me.momotime.java8.feature;
public interface StudentFilter {
boolean test(Student s);
}
//实现类
package me.momotime.java8.feature;
public class StudentFilterImpl implements StudentFilter {
@Override
public boolean test(Student s) {
return s.getAge() > 15;
}
}

2. jdk8中,接口里面可以通过default写实现方法。

1
2
3
4
5
6
7
8
9
10
package me.momotime.java8.feature;
public interface StudentFilter {
boolean test(Student s);
/**
* 默认方法
*/
default boolean test2(Student s) {
return s.getAge() > 0;
}
}

2.1在实现类中,接口的默认方法可以不重写,只重写未实现的方法

1
2
3
4
5
6
7
package me.momotime.java8.feature;
public class StudentFilterImpl2 implements StudentFilter {
@Override
public boolean test(Student s) {
return s.getAge() < 100;
}
}

可以直接调用接口的默认方法

1
2
3
4
5
//省略部分代码---
StudentFilter filter = new StudentFilterImpl2();
Student s = new Student("aa", 12, "male");
filter.test2(s);
//省略部分代码---

2.2可以重写默认方法

1
2
3
4
5
6
7
8
9
10
11
12
package me.momotime.java8.feature;
public class StudentFilterImpl2 implements StudentFilter {
@Override
public boolean test(Student s) {
return s.getAge() < 100;
}
// 重写接口默认方法
@Override
public boolean test2(Student s) {
return s.getAge() > 15;
}
}