Java 教程

Java 控制语句

面向对象编程

Java 内置类

Java 文件处理

Java 错误和异常

Java 多线程

Java 同步

Java 网络

Java 集合

Java 接口

Java 数据结构

Java 集合算法

高级 Java

Java 杂项

Java API 和框架

Java 类参考

Java 有用资源

Java - 接口中的默认方法



Java 默认方法

Java 在 Java 8 中的 接口 中引入了默认方法实现的新概念。在 Java 8 之前,接口只能有 抽象方法。添加默认方法功能是为了向后兼容,以便旧接口可以利用 Java 8 的 lambda 表达式 功能。

例如,ListCollection 接口没有 'forEach' 方法声明。因此,添加此方法将简单地破坏集合框架的实现。Java 8 引入了默认方法,以便 List/Collection 接口可以具有 forEach 方法的默认实现,而实现这些接口的类无需实现相同的。

语法

以下是 Java 中接口中默认方法的语法:

public interface vehicle {

   default void print() {
      System.out.println("I am a vehicle!");
   }
}

Java 默认方法示例

package com.tutorialspoint;

interface vehicle {
   // default method must have an implementation
   default void print() {
      System.out.println("I am a vehicle!");
   }
}

// implementing class needs not to implement the default method
// of an interface.
public class Tester implements vehicle {
   public static void main(String args[]) {
      Tester tester = new Tester();
      // implementing class can access the default method as its own method
      tester.print(); 
   }
}

让我们编译并运行上述程序,这将产生以下结果:

I am a vehicle!

多重继承中的默认方法

使用接口中的默认函数,有可能一个类实现了两个具有相同默认方法的接口。以下代码解释了如何解决这种歧义。

public interface vehicle {

   default void print() {
      System.out.println("I am a vehicle!");
   }
}

public interface fourWheeler {

   default void print() {
      System.out.println("I am a four wheeler!");
   }
}

第一个解决方案是创建一个覆盖默认实现的自己的方法。

public class car implements vehicle, fourWheeler {

   public void print() {
      System.out.println("I am a four wheeler car vehicle!");
   }
}

示例:使用自己的实现覆盖接口的默认方法

在此示例中,我们创建了两个具有相同默认方法 print() 的接口。由于 Car 类实现了这两个接口,因此它必须重写默认方法,否则编译器将抱怨重复的默认方法。在使用自己的实现重写默认方法后,我们可以轻松地使用 Car 类的 print 方法,如下所示

package com.tutorialspoint;

interface Vehicle {
   default void print() {
      System.out.println("I am a vehicle!");
   }
}

interface FourWheeler {
   default void print() {
      System.out.println("I am a four wheeler!");
   }
}

class Car implements Vehicle, FourWheeler {
   // overriding the default method will resolve the ambiguity
   public void print() {
      System.out.println("I am a four wheeler car vehicle!");
   }
}

public class Tester {
   public static void main(String args[]) {
      Car car = new Car();
      car.print(); 
   }
}

让我们编译并运行上述程序,这将产生以下结果:

I am a four wheeler car vehicle!

第二个解决方案是使用 super 调用指定接口的默认方法。

public class car implements vehicle, fourWheeler {

   public void print() {
      vehicle.super.print();
   }
}

示例:调用接口的默认方法

在此示例中,我们创建了两个具有相同默认方法 print() 的接口。由于 Car 类实现了这两个接口,因此它必须重写默认方法,否则编译器将抱怨重复的默认方法。在使用自己的实现重写默认方法后,我们可以轻松地使用 Car 类的 print 方法,如下所示

package com.tutorialspoint;

interface Vehicle {
   default void print() {
      System.out.println("I am a vehicle!");
   }
}

interface FourWheeler {
   default void print() {
      System.out.println("I am a four wheeler!");
   }
}

class Car implements Vehicle, FourWheeler {
   // use the default method of a interface
   public void print() {
      FourWheeler.super.print();
   }
}

public class Tester {
   public static void main(String args[]) {
      Car car = new Car();
      car.print(); 
   }
}

让我们编译并运行上述程序,这将产生以下结果:

I am a four wheeler!

Java 中的静态默认方法

从 Java 8 开始,接口也可以具有静态默认方法。这些静态方法充当帮助器或实用程序函数,有助于更好地封装代码。

public interface vehicle {

   default void print() {
      System.out.println("I am a vehicle!");
   }
	
   static void blowHorn() {
      System.out.println("Blowing horn!!!");
   }
}

示例:调用接口的静态默认方法

在此示例中,我们创建了两个具有相同默认方法 print() 的接口。由于 Car 类实现了这两个接口,因此它必须重写默认方法。在重写默认方法并调用接口实现后,我们直接调用了静态方法,如下所示

package com.tutorialspoint;

interface Vehicle {

   default void print() {
      System.out.println("I am a vehicle!");
   }
	
   static void blowHorn() {
      System.out.println("Blowing horn!!!");
   }
}

interface FourWheeler {

   default void print() {
      System.out.println("I am a four wheeler!");
   }
}

class Car implements Vehicle, FourWheeler {

   public void print() {
      // call the Vehicle interface default print method   
      Vehicle.super.print();
      FourWheeler.super.print();
	  // call the Vehicle interface static blowHorn method  
      Vehicle.blowHorn();
      System.out.println("I am a car!");
   }
}
public class Tester {

   public static void main(String args[]) {
      Vehicle vehicle = new Car();
      vehicle.print();
      // call the Vehicle interface static blowHorn method 
	  Vehicle.blowHorn();
   }
}

让我们编译并运行上述程序,这将产生以下结果:

I am a vehicle!
I am a four wheeler!
Blowing horn!!!
I am a car!
Blowing horn!!!
广告