32
interface TestA {
    String toString();
}

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

结果是什么?

A. 测试
B. null
C. 运行时抛出异常。
D. 由于第 1 行错误,
编译失败。 E. 由于第 4 行错误,
编译失败。 F. 由于第 5 行错误,编译失败。

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

4

6 回答 6

91

您在这里看到的是一个匿名内部类

给定以下界面:

interface Inter {
    public String getString();
}

您可以像这样创建类似它的实例:

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

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

于 2010-10-22T19:05:29.823 回答
5

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

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

于 2010-10-22T19:03:51.143 回答
1

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

Inter instance = new Inter() {
    public String getString() {
        return "HI" + this.getClass();
    }
};
于 2011-02-15T12:11:38.710 回答
1

诀窍不仅在于匿名内部类,这个打印测试会导致它覆盖 toString 方法,而System.out.printlnObject 它隐式调用它的 toString 方法。

于 2011-01-03T19:15:13.420 回答
0

我们可以创建一个匿名类的对象,它实现了接口:

匿名类使您能够使您的代码更简洁。它们使您能够同时声明和实例化一个类。它们类似于本地类,只是它们没有名称。如果您只需要使用一次本地类,请使用它们。

如果你有一个接口,声明一个方法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".

于 2020-08-31T02:36:09.773 回答
-2

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

在这里,您正在实例化一个并通过编写实现继承,

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

结果当然是test

于 2014-03-21T12:19:28.397 回答