2010-10-22 122 views
26
interface TestA { 
    String toString(); 
} 

public class Test { 
    public static void main(String[] args) { 
     System.out.println(new TestA() { 
      public String toString() { 
       return "test"; 
      } 
     }); 
    } 
} 

结果是什么?我们可以创建一个接口的对象吗?

A. test
B. null
C.在运行时抛出异常。
D.编译失败,因为在线路中的错误1.
E.编译失败,因为在线路中的错误4.
F.编译失败,因为在线路5

错误什么是答案的这个问题,为什么?关于这个问题,我还有一个疑问。在第4行中,我们创建了一个A的对象。是否可以创建一个接口的对象?

+11

貌似测试问题。顺便说一句,你为什么不试试? – Kel 2010-10-22 19:04:22

+7

您通过运行它获得的答案。 – Bozho 2010-10-22 19:04:25

+4

@凯尔:也许他想要解释为什么这会起作用? – 2010-10-22 19:08:25

回答

5

test应该是输出。这是一个匿名内部类的例子。

这是一种非常常见的与Comparator接口一起使用的模式,用于模拟闭包。

76

什么,你在这里看到的是一个anonymous inner class

考虑到如下界面:

interface Inter { 
    public String getString(); 
} 

您可以像像这样的一个实例创造的东西:

Inter instance = new Inter() { 
    @Override 
    public String getString() { 
     return "HI"; 
    } 
    }; 

现在,你有一个你定义的接口的实例。但是,你应该注意到你实际上做了什么定义了一个类来实现接口并同时实例化类。

+2

我一直在寻找它。它是一个非常简短的答案。 +1简单。 – amod 2012-07-10 14:31:05

+0

我想知道为什么这不被接受为答案。 – 2012-12-13 10:29:06

+1

简单和完美的答案,非常感谢 – smoothumut 2015-03-26 15:04:11

1

技巧并不完全是关于annonymous内部类,这打印测试原因它覆盖toString方法,而System.out.println一个对象它隐式调用它的toString方法。

1

也试试这个...生成匿名类的名字!

Inter instance = new Inter() { 
    public String getString(){ return "HI"+this.getClass(); } 
}; 
-1

我不知道这个问题的意义。如果这是一个面试问题,那么我可以说没关系。但是实时地,这不是实施继承的正确方法。所以要回答这个问题的答案,在这里你所做的是一个匿名内部类

在这里,你可以通过写实例化一个实现继承

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

和ofcourse结果将是test

相关问题