📜  Java 8中的默认方法

📅  最后修改于: 2020-04-02 05:15:32             🧑  作者: Mango

在Java 8之前,接口只能具有抽象方法。这些方法的实现必须在单独的类中提供。因此,如果要在接口中添加新方法,则必须在实现相同接口的类中提供其实现代码。为克服此问题,Java 8引入了默认方法的概念,该方法允许接口具有可实现的方法,而不会影响实现接口的类。

//  Java接口的默认方法
interface TestInterface
{
    // 抽象方法
    public void square(int a);
    // 默认方法
    default void show()
    {
      System.out.println("默认方法被执行");
    }
}
class TestClass implements TestInterface
{
    // 实现square静态方法
    public void square(int a)
    {
        System.out.println(a*a);
    }
    public static void main(String args[])
    {
        TestClass d = new TestClass();
        d.square(4);
        // 默认方法被执行
        d.show();
    }
}

输出:

 16
 默认方法被执行

引入了默认方法以提供向后兼容性,以便现有接口可以使用lambda表达式,而无需在实现类中实现这些方法。默认方法也称为防御者方法虚拟扩展方法

静态方法:
接口也可以具有静态方法,类似于类的静态方法。

// Java程序,展示接口的静态方法
interface TestInterface
{
    // abstract抽象方法
    public void square (int a);
    // static静态方法
    static void show()
    {
        System.out.println("静态方法被执行");
    }
}
class TestClass implements TestInterface
{
    // 实现square抽象方法
    public void square (int a)
    {
        System.out.println(a*a);
    }
    public static void main(String args[])
    {
        TestClass d = new TestClass();
        d.square(4);
        // 静态方法被执行
        TestInterface.show();
    }
}

输出:

 16
 静态方法被执行

默认方法和多重继承
如果两个已实现的接口都包含具有相同方法签名的默认方法,则实现类应显式指定要使用的默认方法,或者应重写默认方法。

// Java展示默认方法和多重继承
interface TestInterface1
{
    // 默认方法
    default void show()
    {
        System.out.println("默认 TestInterface1");
    }
}
interface TestInterface2
{
    // 默认方法
    default void show()
    {
        System.out.println("默认 TestInterface2");
    }
}
// 类的实现
class TestClass implements TestInterface1, TestInterface2
{
    // 重写show方法
    public void show()
    {
        // 使用super,调用TestInterface1接口
        TestInterface1.super.show();
        // 使用super,调用TestInterface2接口
        TestInterface2.super.show();
    }
    public static void main(String args[])
    {
        TestClass d = new TestClass();
        d.show();
    }
}

输出:

默认 TestInterface1
默认 TestInterface2

重要事项:

  1. 接口可以具有默认方法,可以在Java 8中实现。
  2. 接口也可以具有静态方法,类似于类中的静态方法。
  3. 引入了默认方法以提供对旧接口的向后兼容性,以便它们可以使用新方法而不会影响现有代码。