interface TestA {
String toString();
}
public class Test {
public static void main(String[] args) {
System.out.println(new TestA() {
public String toString(){
return "test";
}
});
}
}
在java中,你永远不能在java中实例化一个接口。但为什么上面的代码将“test”打印为输出而不是引发错误?
答案 0 :(得分:1)
因为您没有实例化interface
,而是定义(并同时实例化)新的class
,所以这是一种新类型,它实现TestA
但没有名称。
答案 1 :(得分:0)
不同之处在于标题中的符号。不同之处在于您正在创建一个实现该接口的匿名类。这完全合法。符号可能看起来有点奇怪但是当你习惯它时你就没有问题了。
答案 2 :(得分:0)
这是一个基于TestA接口的匿名类定义
答案 3 :(得分:0)
您为它创建了一个匿名类。这个匿名类创建的对象将实现Test
。它将被传递给println(...)
函数
稍后将调用传递对象的toString()
方法并在屏幕上打印返回值。这就是它打印" test&#34 ;;
答案 4 :(得分:0)
由于你有一个接口,通常你会有一个类来实现这样的接口。
class TestAImp implements TestA {
//Some other Code
String toString(){
return "test";
}
}
要使用此对象,您将执行类似这样的操作
public class Test {
public static void main(String[] args) {
System.out.println(new TestAImp().toString());
}
}
现在假设出于某种目的,您决定不声明实现该接口的类,但您希望实现该接口。这就是匿名类的用武之地。对于匿名类,您不必在某个文件.java中编写该类的代码,而是在创建对象本身时编写该类的代码。
由于您的界面只有一个方法,您可以创建匿名类,如下所示。我宣布2个类Test和Test2有2个不同的接口实现。
public class Test {
public static void main(String[] args) {
System.out.println(new TestA() {
public String toString(){
return "test1";
}
});
}
}
public class Test2 {
public static void main(String[] args) {
System.out.println(new TestA() {
public String toString(){
return "test2";
}
});
}
}