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()但我读取的接口无法实例化.
有人可以解释为什么它打印成功?
你在这里做的是创建一个匿名类,并实例化它.所以你的对象的类型不是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)