你能在初始化时实现一个接口吗?

Can you implement an interface during initialization?

我在阅读 Oracle 的 lambda 表达式教程之一时,遇到了以下代码:

http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/Lambda-QuickStart/index.html

public class RunnableTest {
  public static void main(String[] args) {

  System.out.println("=== RunnableTest ===");

  // Anonymous Runnable
  Runnable r1 = new Runnable(){

    @Override
    public void run(){
      System.out.println("Hello world one!");
    }
  };

  // Lambda Runnable
  Runnable r2 = () -> System.out.println("Hello world two!");

  // Run em!
  r1.run();
  r2.run();
  }
}

我的问题是为什么他们在创建 class 时没有实现 Runnable?由于他们在初始化 r1 时覆盖了 运行 方法,因此是否负责实现?

是的,这在 Java 中称为匿名 class。

https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html

您可以在使用new 运算符时实现一个接口或扩展一个class,这将创建您当时定义的未命名subclass 的新实例。它主要用于编写要在另一个线程中使用或作为回调的代码,因为您只会获得一个实例。

Java 8 中的新 lambda 语法取代了匿名 classes 用于具有单一方法的接口,例如 Runnable 或 java.util.function 中的接口。这就是他们在示例中展示的内容。