Java 在 Java 8 中引入了接口中默认方法实现的新概念。在 Java 8 之前,接口只能包含抽象方法。默认方法功能是为了向后兼容而添加的,这样旧的接口可以利用 Java 8 的 Lambda 表达式能力。
例如,List 或 Collection 接口没有 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 void print() {
System.out.println("I am a vehicle!");
}
}
public class Tester implements vehicle {
public static void main(String args[]) {
Tester tester = new Tester();
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 {
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 {
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() {
Vehicle.super.print();
FourWheeler.super.print();
Vehicle.blowHorn();
System.out.println("I am a car!");
}
}
public class Tester {
public static void main(String args[]) {
Vehicle vehicle = new Car();
vehicle.print();
Vehicle.blowHorn();
}
}
编译并运行以上程序,将产生以下结果:
I am a vehicle!
I am a four wheeler!
Blowing horn!!!
I am a car!
Blowing horn!!!