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

Con*_*and 5 java lambda interface runnable

我正在阅读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();
  }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么他们在创建类时没有实现Runnable?因为在初始化r1时它们会覆盖run方法,所以这样做是否可以实现呢?

Sea*_*der 2

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

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

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

Java 8 中新的 lambda 语法用单个方法替换了接口的匿名类,例如 Runnable 或java.util.function中的接口。这就是他们在示例中演示的内容。