Java 8 中的默认方法
在Java 8 之前,接口只能有抽象方法。这些方法的实现必须在一个单独的类中提供。因此,如果要在接口中添加新方法,则必须在实现相同接口的类中提供其实现代码。为了克服这个问题, Java 8 引入了默认方法的概念,它允许接口具有具有实现的方法,而不会影响实现接口的类。
// A simple program to Test Interface default
// methods in java
interface TestInterface
{
// abstract method
public void square(int a);
// default method
default void show()
{
System.out.println("Default Method Executed");
}
}
class TestClass implements TestInterface
{
// implementation of square abstract method
public void square(int a)
{
System.out.println(a*a);
}
public static void main(String args[])
{
TestClass d = new TestClass();
d.square(4);
// default method executed
d.show();
}
}
输出:
16
Default Method Executed
引入了默认方法以提供向后兼容性,以便现有接口可以使用 lambda 表达式,而无需实现实现类中的方法。默认方法也称为防御方法或虚拟扩展方法。
静态方法:
接口也可以有静态方法,类似于类的静态方法。
// A simple Java program to TestClassnstrate static
// methods in java
interface TestInterface
{
// abstract method
public void square (int a);
// static method
static void show()
{
System.out.println("Static Method Executed");
}
}
class TestClass implements TestInterface
{
// Implementation of square abstract method
public void square (int a)
{
System.out.println(a*a);
}
public static void main(String args[])
{
TestClass d = new TestClass();
d.square(4);
// Static method executed
TestInterface.show();
}
}
输出:
16
Static Method Executed
默认方法和多重继承
如果两个实现的接口都包含具有相同方法签名的默认方法,则实现类应明确指定要使用的默认方法,或者它应该覆盖默认方法。
// A simple Java program to demonstrate multiple
// inheritance through default methods.
interface TestInterface1
{
// default method
default void show()
{
System.out.println("Default TestInterface1");
}
}
interface TestInterface2
{
// Default method
default void show()
{
System.out.println("Default TestInterface2");
}
}
// Implementation class code
class TestClass implements TestInterface1, TestInterface2
{
// Overriding default show method
public void show()
{
// use super keyword to call the show
// method of TestInterface1 interface
TestInterface1.super.show();
// use super keyword to call the show
// method of TestInterface2 interface
TestInterface2.super.show();
}
public static void main(String args[])
{
TestClass d = new TestClass();
d.show();
}
}
输出:
Default TestInterface1
Default TestInterface2
要点:
- 接口可以具有在Java 8 中稍后实现的默认方法。
- 接口也可以有静态方法,类似于类中的静态方法。
- 引入了默认方法来为旧接口提供向后兼容性,以便它们可以拥有新方法而不会影响现有代码。