java8 新特性:接口默认方法和静态方法

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<Animal> 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();

    }
}

我比其他鱼游的更快

发布了90 篇原创文章 · 获赞 29 · 访问量 7261

猜你喜欢

转载自blog.csdn.net/weixin_38982591/article/details/104651460