interface TestA {
String toString();
}
public class Test {
public static void main(String[] args) {
System.out.println(new TestA() {
public String toString() {
return "test";
}
});
}
}
结果是什么?
一个。测试
B. null
C.运行时抛出异常
D.由于第1行中的错误,编译失败。
E.由于第4行的错误,编译失败。
F.由于第5行出错,编译失败。
这个问题的答案是什么?为什么?关于这个问题我还有一个问题。在第4行中,我们创建了A的对象。是否可以创建接口的对象?
答案 0 :(得分:86)
您在这里看到的是anonymous inner class:
给出以下界面:
interface Inter {
public String getString();
}
您可以像这样创建像它的实例:
Inter instance = new Inter() {
@Override
public String getString() {
return "HI";
}
};
现在,您有一个您定义的接口实例。但是,你应该注意到你实际完成的是定义了一个实现接口并同时实例化类的类。
答案 1 :(得分:5)
test
应该是输出。这是一个匿名内部类的例子。
这是一种非常常见的模式,与Comparator
接口一起用作闭包的模拟。
答案 2 :(得分:1)
诀窍并不完全是关于匿名内部类,这打印测试导致它覆盖toString方法,而System.out.println是一个Object,它隐式调用它的toString方法。
答案 3 :(得分:1)
试试这个......生成匿名类的名称!
Inter instance = new Inter() {
public String getString(){ return "HI"+this.getClass(); }
};
答案 4 :(得分:0)
我们可以创建一个anonymous class 对象,该对象实现了接口:
匿名类使您可以使代码更简洁。它们使您可以同时声明和实例化一个类。它们就像本地类,只是它们没有名称。如果只需要使用一次本地类,则使用它们。
如果您有一个声明一个方法toString
的接口,则可以首先创建一个实现此接口的类,然后创建该类的对象:
interface TestA {
String toString();
}
class TestB implements TestA {
@Override
public String toString() {
return "test";
}
}
public class Test {
public static void main(String[] args) {
System.out.println(new TestB());
}
}
或者您可以创建匿名类的对象来简化此代码:
interface TestA {
String toString();
}
public class Test {
public static void main(String[] args) {
System.out.println(new TestA() {
@Override
public String toString() {
return "test";
}
});
}
}
在两种情况下,它都打印"test"
。
答案 5 :(得分:-1)
我不知道这个问题的重要性。如果这是一个面试问题,那么我可以说它没问题。但实时它并不是实现继承的正确方法。所以问到这个问题的答案,你在做什么是匿名内部类。
在这里,您通过编写实例化类和实现继承,
System.out.println(new TestA() {
public String toString() {
return “test”;
}
});
当然结果是test