能够实例化接口

Van*_*jul 0 java interface object

我的印象是可以实例化一个接口:

interface TestA { 
   String toString(); 
}

public class Test {
    public static void main(String[] args) {

       System.out.println(new TestA() {
          public String toString() { 
              return "test"; 
          }
       });
    }
 }
Run Code Online (Sandbox Code Playgroud)

这打印"test".为什么?该类未实现该接口.

它还创建了一个使用它的实例,new TestA()但我读取的接口无法实例化.

有人可以解释为什么它打印成功?

Vic*_*yew 6

到底是怎么回事

你在这里做的是创建一个匿名类,并实例化它.所以你的对象的类型不是TestA,但实际上是匿名类的类型.

TestA myObject = new TestA(){ ... }
Run Code Online (Sandbox Code Playgroud)

是一个快捷方式:

class ClassA implements TestA { ... }
TestA myObject = new ClassA();
Run Code Online (Sandbox Code Playgroud)

在此示例中,虽然引用的类型是myObject TestA,但引用的对象的类型是ClassA,它实现的类型TestA.

您可以在此处阅读Java Tutorial中的匿名类.

"正在发生什么"的最后一步是你System.out.println对创建的对象的调用,结果调用它的toString()方法.

因此,为了打破正在发生的所有步骤,您的代码相当于:

public class Test {

   public static void main(String[] args){

      class ClassA implements TestA {

        public String toString(){
            return "test";
        }
      }
      TestA myObject = new ClassA();
      String myString = myObject.toString();
      System.out.println(myString);
   }
}
Run Code Online (Sandbox Code Playgroud)

回答你的确切问题

所以要回答你的确切问题:

  • 实际上,你的类Test没有实现接口,匿名类也是如此.它同时执行它,因为它被声明为实现它,并且因为它正确地实现了抽象方法toString
  • 实际上,接口无法实例化.在这种情况下,您不是实例化接口,而是实例化接口所定义的匿名类.

如果您想检查第二点,可以尝试删除匿名类定义的主体.它不会编译:

System.out.println(new TestA()); // Compile error
Run Code Online (Sandbox Code Playgroud)