在Java中,新TestA()和TestA obj = new TestA()之间有什么区别?

时间:2016-01-28 05:00:07

标签: java inheritance interface

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”打印为输出而不是引发错误?

5 个答案:

答案 0 :(得分:1)

因为您没有实例化interface,而是定义(并同时实例化)新的class,所以这是一种新类型,它实现TestA但没有名称。

那是anonymous class

答案 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"; 
            } 
        });
    }
}