JDK1.8开始,接口允许定义默认方法和静态方法。
1、默认方法
接口默认方法的语法很简单,即:
default关键字 methodName(参数列表) { // 实现体 }
接口静态方法语法与类的静态方法类似,不同的是接口静态方法的修饰符只能是public。
举个简单的例子,假如有一个Animal接口其中有fly()和swim()方法,有一个鸟类Bird和一个鱼类Fish同时实现这个接口,代码如下:
public interface Animal {
void fly();
void swim();
}
public class Bird implements Animal{
@Override
public void fly() {
}
@Override
public void swim() {
}
}
public class Fish implements Animal{
@Override
public void fly() {
}
@Override
public void swim() {
}
}
因为我们在Animal中定义了fly和swim方法,所以所有的类实现的时候必须覆盖这两个方法,但是鸟类不会swim,鱼类不会fly,但是又必须实现这些方法,导致了代码冗余。
因为我们可以利用jdk8 新特性:默认方法
public interface Animal {
default void fly() {
System.out.println("我会飞");
}
default void swim() {
System.out.println("我会游泳");
}
}
public class Bird implements Animal{
}
public class Fish implements Animal{
}
2、静态方法
假如有一个Animal工厂接口,该接口中有一个静态方法create()专门生产不同的Animal,在JDK1.8后由于引入了Lambda表达式,使子类不用覆写该接口的create()方法也可以生产任意的Animal,代码如下:
public interface AnimalFactory {
static Animal create(Supplier supplier){
return supplier.get();
}
}
public class Test {
public static void main(String[] args) {
// 工厂生产一只鸟
Animal bird = AnimalFactory.create(Bird::new);
bird.fly();
// 工厂生产一条鱼
Animal fish = AnimalFactory.create(Fish::new);
fish.swim();
}
}
3、接口静态方法的“类优先”原则
假如我们的实现类重写了接口的方法,那么类中的这个方法就会优先。
public class Fish implements Animal{
@Override
public void swim() {
System.out.println("我比其他鱼游的更快");
}
}
public class Test {
public static void main(String[] args) {
// 工厂生产一条鱼
Animal fish = AnimalFactory.create(Fish::new);
fish.swim();
}
}
我比其他鱼游的更快
标签:swim,静态方法,void,默认,public,接口,Animal,java8
来源: https://blog.csdn.net/weixin_38982591/article/details/104651460