能够实例化接口

时间:2016-08-27 12:57:07

标签: java object interface

我的印象是可以实例化一个界面:

interface TestA { 
   String toString(); 
}

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

       System.out.println(new TestA() {
          public String toString() { 
              return "test"; 
          }
       });
    }
 }

这会打印"test"。为什么?该课程没有实现该界面。

它还使用new TestA()创建它的实例但我读取的接口无法实例化。

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

1 个答案:

答案 0 :(得分:6)

发生了什么

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

TestA myObject = new TestA(){ ... }

是:

的快捷方式
class ClassA implements TestA { ... }
TestA myObject = new ClassA();

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

您可以在Java教程here中阅读有关匿名类的内容。

“正在发生的事情”的最后一步是,您在创建的对象上调用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);
   }
}

回答您的确切问题

所以回答你的确切问题:

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

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

System.out.println(new TestA()); // Compile error