创建对象时声明方法

为什么第一种方式是正确的,但第二种方式不是?


第一种方式:

new Object() {
    public void a() {
        /*code*/
    }
}.a();

第二种方式:

Object object = new Object() {
    public void a() {
        /*code*/
    }
};

object.a();

在哪里可以找到有关它的更多信息?


答案 1

java.lang.Object 没有声明的方法 (2),而类实例创建表达式返回的匿名类有声明 (1)。anew Object() { public void a() {} }

使用 Java 10 的局部变量类型推理 () 使第二个选项与第一个选项一样有效。var

var object = new Object() {
    public void a() {}
};
object.a();

答案 2

在第二个选项中,将新对象指定给 类型的引用。因此,只能在该引用上调用 中定义的方法。Objectjava.lang.Object

在第一个选项中,您基本上创建了扩展的匿名类的新对象。该匿名类具有附加方法 ,这就是为什么您可以调用它的原因。java.lang.Objecta()