Java 8中的接口默认方法

时间:2020-02-23 14:34:50  来源:igfitidea点击:

在本教程中,我将在Java 8中引入的接口中引入默认方法。

当我们创建一个接口时,我们是否面临过这种情况,并且许多类实现该接口。
现在我们需要将新方法添加到接口。
添加新方法后,Java项目将充满编译错误,因为我们需要将这些新方法添加到实现该接口的所有类(如果类实现接口,则必须在类中实现其所有方法)

让我们举个例子:创建一个名为Dootable的接口

public interface Decorable {
    void decorateWithCurtains();
    }

现在创建一个名为room的类,它将实现此接口。

public class Room implements Decorable{
    public void decorateWithCurtains() {
        System.out.println("Decorate room with Curtains");
    }
}

现在这是我们当前的实现,现在我们有一种新的装饰方式,我们希望将其添加到"装饰Inteface"。
当我们将此方法添加到装饰接口时

public interface Decorable {
 
    void decorateWithCurtains();
    void decorateWithPaints();
 }

如果我们使用默认方法怎么办:

public interface Decorable {
    void decorateWithCurtains();
    default void decorateWithPaints()
    {
           System.out.println("Decorate using paints");
    }
  }

正如我们所看到的,我们制作了DecorateWithPaints()默认值,我们不会在客房类中获得任何错误,因为我们在装饰接口中提供了默认实现。

为什么默认方法

oneliner为此可能是"向后兼容性"。
如果jdk修改了一个接口,那么实现这个接口的所有类都将破裂。

为了在Java 8中添加Lambda表达式,JDK需要将方法(例如Foreach)添加到列表或者集合接口,但如果将此方法添加到这些接口,则将百万代码作为实现接口的类别,需要实施所有方法。

通过在接口中添加默认方法,我们可以在不影响实现类的情况下提供默认实现,因为它包括该方法的实现以及需要该方法可以覆盖它的任何实现类。

多重继承怎么样?

将默认实现添加到接口可能会导致多重继承中的模糊性。
由于两个接口可以提供相同的默认方法,并且在调用时可能存在歧义。
当出现这种情况时,Calling.java 8将为我们编译时异常。

public interface Decorable {
    default void decorateWithPaints()
    {
       System.out.println("Decorate using paints");
    }
   }
 
public interface Paintable
{
    default void decorateWithPaints()
    {        
        System.out.println("Decorate using paints");  
    }
}
 
public class Room implements Decorable,Paintable{
    }

我们可以通过在 Room类 中覆盖Decoratewithpaints方法来解决此编译错误

public class Room implements Decorable,Paintable{
 
    public void decorateWithPaints()
    {       
        System.out.println("Decorate using paints");  
  }
}