仅创建Interface实例的目的是什么?

时间:2017-08-26 13:08:53

标签: java interface

我对接口的了解是:

1)接口是方法列表,即模板

2)接口类型可以引用实现该接口的类的对象。

今天我遇到了以下代码

interface Test  
{  
  void greet();  
}  
public class Demo  
{  
  public static void main(String[] args)  
  {  
    Test t = new Test()  ---> Is it correct ? WHY ?
     {  
       public void greet()  
       {  
         System.out.print("\nHi, Best wishes to way2java.com\n");  
       }  
    };  
    t.greet();  
    }  
}  

无法理解以下代码段的意图

Test t = new Test() 

1)接口是否有构造函数?我的知识说接口只有方法列表而不是定义

2)创建Interface对象是否合法?据我所知,接口类型只能引用实现该接口的类对象。

3)如果它合法,那么目的是什么?

由于

1 个答案:

答案 0 :(得分:1)

1)不,他们没有。

2)否。

您在这里创建的是实现您的界面的匿名类 - 请注意您被迫实施greet方法。

当您只是不关心为您的实现提供特定名称时,您的代码中存在某些情况 - 然后您可以传递匿名内部类 - Java中lambda表达式的整个概念基于此。

假设您要使用forEach方法打印列表内容:

Arrays.asList(1, 2, 3)
  .forEach(...);

forEach接受作为接口的Consumer实例。所以,你可以创建自己的类:

class IntegerPrinter implements Consumer<Integer> {

@Override
public void accept(Integer integer) {
    System.out.println(integer);
}

但是为它创建一个新类太简单了,所以可以传递一个匿名实例:

Arrays.asList(1, 2, 3)
  .forEach(new Consumer<Integer>() {
      @Override
      public void accept(Integer integer) {
          System.out.println(integer);
      }
  });

稍微好些但仍然相当冗长。这就是lambda表达式派上用场的地方:

 Arrays.asList(1, 2, 3)
   .forEach(integer -> System.out.println(integer));