Java8 - 学习接口中的默认方法和静态方法的教程与实例

121 阅读4分钟

在这篇博文中,你将通过实例来学习接口中的默认方法和静态方法的教程。

为什么需要默认方法接口?

缺省方法是java 8版本中引入的功能之一。

在Java 8版本之前,接口只有抽象方法。抽象方法的实现必须由实现该接口的类来提供。

如果任何接口代码被发布,我们就不能改变接口结构。

如果需要对接口进行任何修改,就会导致实现接口的类的代码中断。

接口声明包含抽象方法,这些方法没有实现,正如下面的例子所述。

class ClassTwo implements MyInterface {  
 public void methodone() {  
 }  
}  
interface MyInterface {  
 public void methodone();  
}  

在上面的例子中,通过实现MyInterface ,声明了一个class 。这样做效果很好。

现在在接口中再添加一个方法--methodtwo ,如下所示。

interface MyInterface {  
    public void methodone();  
    public void methodtwo();  
  
}  

在现有的接口中添加新的方法后,ClassTwo ,出现了编译错误,并破坏了功能。

类型ClassTwo 必须实现继承的抽象方法MyInterface.methodtwo() 。解决这个问题的方法是为新方法提供一个实现。

这就迫使客户在接口发生变化时扩展其功能。这与类的设计是矛盾的。

当你实现了新方法后,ClassTwo编译成功。

为了避免这种类型的设计问题,在java8中引入了接口中的Default方法

默认方法为接口增加了额外的功能,以不破坏实现它的类的结构。

默认方法是向后兼容以前的版本的。

default关键字的重要说明

  • default 是一个关键字,只在java 8版本的接口中起作用。
  • 接口方法必须以关键字为前缀default
  • default 实现类中的方法不需要提供实现。
  • Default 方法可以被重写
  • Default 方法提供了向后的兼容性
  • 这些方法在java中也可以称为defendvirtual 方法。

接口中的默认方法示例

在下面的代码中,methodDefault()InterfaceDemo 的默认方法。

在不破坏实现类的结构的情况下,为接口添加了额外的功能。

public class MyClass implements InterfaceDemo {  
 @Override  
 public void methodHeader() {  
  System.out.println("methodHeader Implementation");  
 }  
 public static void main(String[] args) {  
  MyClass myClassObject = new MyClass();  
  
  // call interfaec abstract method  
  myClassObject.methodDefault();  
  // Call Interface abstract method  
  myClassObject.methodHeader();  
 }  
}  
interface InterfaceDemo {  
 // This is default method  
 default void methodDefault() {  
  System.out.println("Default method");  
 }  
 // This is abstract method  
 void methodHeader();  
}  

输出

Default method  
methodHeader Implementation  

java中带有默认方法的接口继承实例

正如你所知,java不支持通过扩展类来实现多重继承,这会导致钻石问题,为了实现多重继承,需要使用多个接口。

default 关键字的情况下,interfaces ,多重继承会导致方法ambiguity 的问题。

在下面的代码中。

我们定义了两个默认方法名相同的接口,通过实现多个接口创建了一个类,如下图所示。

interface InterfaceOne {  
    default void method(){  
       System.out.println("InterfaceOne.method()");  
    }  
}  
  
interface InterfaceTwo {  
    default void method(){  
       System.out.println("InterfaceTwo.method()");  
    }  
}  
  
public class ClassOne implements InterfaceOne, InterfaceTwo{  
}  

这段代码抛出了编译错误,理由是:从InterfaceTwo和InterfaceOne类型中继承了重复的默认方法,名为()和()的方法。对重复的默认方法的修复是覆盖默认方法,如下所示。

public class ClassOne implements InterfaceOne, InterfaceTwo{  
    public void method(){  
        System.out.println("class method");  
     }  
}  

要调用InterfaceOne的默认方法,在实现的方法中使用super 关键字和方法名。

public void method(){  
     InterfaceOne.super.method();      
      
    } 

接口静态方法示例

Static 方法类似于接口中的 default方法。它们在接口中增加了额外的功能,而不会破坏实现类中的代码。静态方法不能在实现类中覆盖。

public class MyClass implements InterfaeDemo {  
 @Override  
 public void methodHeader() {  
  System.out.println("methodHeader Implementation");  
 }  
 public static void main(String[] args) {  
  MyClass myClassObject = new MyClass();  
  
  // call interfaec abstract method  
  myClassObject.methodDefault();  
  
  // Call Interface abstract method  
  myClassObject.methodHeader();  
  // interface static method is calling  
  InterfaeDemo.methodStatic();  
 }  
  
}  
interface InterfaeDemo {  
 // This is default method  
 default void methodDefault() {  
  System.out.println("Default Method");  
 }  
 static void methodStatic() {  
  System.out.println("Static Method");  
 }  
 // This is abstract method  
 void methodHeader();  
}  

输出

Default Method  
methodHeader Implementation  
Static Method  

java8中抽象方法和默认接口方法的区别?

interface ,现在有Default 方法的主体。抽象有具体的方法。但是这两者是不一样的。

一个抽象类有一个构造函数,接口没有构造函数。

抽象类用它们定义了结构化的状态。接口增加了默认实现。两者都是为了不同的目的而定义的。

接口中默认方法和静态方法的区别?

一个static 方法不能在实现类中被重写,默认方法可以在实现类中被重写。

静态方法可以被实现类中的Interface访问,因为这些方法属于Interface。默认方法可以被实现类的对象访问。类和接口包含相同的静态方法名称,但它们并不互相覆盖。