这个接口是否被实例化? (Java 8)

时间:2017-08-17 23:11:49

标签: java

据我所知,接口无法直接实例化。但是,每当我编译以下代码时:

interface A {};

public class Test {
   public static void main(String[] args){
       A a = new A() {};
       system.out.println(a);

它输出类Test的对象的toString():

Test$16d06d69c

当我改变

A a = new A() {};

A a = new A();

它没有编译。为什么会这样?接口是否被实例化,或者是幕后发生的其他事情?

2 个答案:

答案 0 :(得分:4)

您正在定义一个新的匿名内联类,它使用以下语句实现接口A:

A a = new A() {};

在同一个语句中,您正在构建新的匿名类定义的新实例。

所以不,你没有实例化一个接口。

答案 1 :(得分:0)

在A定义方法的情况下,对@ bhspencer的回答进行阐述:

接口没有构造函数,无法直接实例化。然而,它可以内联实现。考虑以下A的实现:

public class B implements A {
   @Override
   public void printMyName() {
       System.out.println("B");
   }
}

实例化B实例的代码:

public A a = new B();

这是接口A的匿名内联实现的等效语法,如下所示:

public A a = new A() {
     @Override
     public void printMyName() {
         System.out.println("B");
     }
}

Java允许我们实现内联接口并实例化它们,而无需创建明确的单独类。