据我所知,接口无法直接实例化。但是,每当我编译以下代码时:
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();
它没有编译。为什么会这样?接口是否被实例化,或者是幕后发生的其他事情?
答案 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允许我们实现内联接口并实例化它们,而无需创建明确的单独类。