我的印象是可以实例化一个界面:
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()
创建它的实例但我读取的接口无法实例化。
有人可以解释为什么打印成功吗?
答案 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