首页 > 解决方案 > 我们如何在 Java 中使用抽象的、私有的、静态的、默认的接口方法?

问题描述

在使用 Java lambda 编码时,我阅读了 Java 接口中的默认方法。所以我试图更多地了解我们可以拥有的 Java 接口中不同类型的方法。更重要的是基于它们的可见性和有效调用。

标签: javainterface

解决方案


Java 接口目前支持抽象、静态、默认、私有方法。直到 JDK7 只有抽象方法,但在 Java8 中引入了静态和默认方法。Java9 引入了私有方法。这些方法类型之间的一些区别如下:

  • 静态、默认、私有方法有主体,但抽象方法没有
  • 抽象和默认方法被称为实例方法,因为它们可以由实现类调用,但私有静态方法只能从静态方法调用,静态方法使用接口名称调用。
  • 除了抽象方法之外,所有其他方法类型都必须有一个主体。
  • 接口方法默认是公共的,但也可以有私有访问。不允许受保护的访问。静态方法也可以是私有的。

让我在这里放一些代码以便更好地理解它:

public interface MyInterface{

    void abstractMethod();

    private void privateMethod() {
        System.out.println("Hi, this is privateMethod");
    }

    private static void staticPrivateMethod() {
        System.out.println("Hi, this is staticPrivateMethod");
    }

    static void staticMethod() {
        //privateMethod();    // Non-static method cannot be referenced from a static contex
        System.out.println("Hi, this is staticMethod");
        staticPrivateMethod();
    }

    default void defaultMethod() {
        System.out.println("Hi, this is defaultMethod");
    }

    default void defaultMethod(int i) {
        System.out.println("Hi, this is defaultMethod with arg");
    }

}

public class MyInterfaceImpl implements MyInterface{

    public static void main(String[] args) {

        MyInterface myInterface = new MyInterfaceImpl();

        MyInterface.staticMethod();
        // myInterface.staticMethod(); // Not allowed

        myInterface.defaultMethod();
        myInterface.defaultMethod(5);
        // MyInterface.defaultMethod(); // Not allowed
    }

    @Override
    public void abstractMethod() {}

    @Override
    public void defaultMethod() {
        System.out.println("Hi, this is MyInterfaceImpl defaultMethod");
    }
}

推荐阅读