创建接口的“对象”

今天我与一位声称可以创建界面对象的朋友争论不休。 当我说这是不可能的时候,他向我展示了以下一段代码,它看起来与匿名类似。现在的问题是,什么是正确的答案?

public interface I { public void f(); } public class InterfaceTest { public static void main(String []args){ new I(){ @Override public void f() { System.out.println("HELLO"); } }; } } 

这真的可以称为创建接口“对象”吗?

不,这是创建实现接口的匿名类的实例。

以下是Java语言规范第15.9节的明确答案:

非限定和限定类实例创建表达式都可以选择以类主体结束。 这样的类实例创建表达式声明了一个匿名类(第15.9.5节)并创建了它的实例。

不,它是(一个实例 )的匿名类。

这是匿名类创建。 上面创建的实例的类扩展了java.lang.Object并实现了接口I.因此,从技术上讲,上面的代码创建了一个Object对象。