在创建对象时声明方法

Sek*_*iki 29 java methods anonymous-inner-class object anonymous-class

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


第一种方式:

new Object() {
    public void a() {
        /*code*/
    }
}.a();
Run Code Online (Sandbox Code Playgroud)

第二种方式:

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

object.a();
Run Code Online (Sandbox Code Playgroud)

我在哪里可以找到更多相关信息?

And*_*lko 43

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

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

var object = new Object() {
    public void a() {}
};
object.a();
Run Code Online (Sandbox Code Playgroud)

  • @ernest_k这真的不是那么难或有趣.通过说`Object object =`你正在向'对象'转换,`var`给```它实际的正确类型,它定义了`a()`. (5认同)
  • @SombreroChicken我在这里理解`var`的效果.但除了问题中的第一个语法之外,没有其他方法(我知道)对匿名类型进行静态引用.现在我知道`var`可以用于此.更重要的是,它允许从匿名类进行多个方法调用.我觉得奇怪的新奇有趣! (2认同)
  • 您还可以声明一个具有`a()`方法的接口,并从*that*而不是`Object`创建一个匿名对象,它可以在不支持`var`的较低版本中工作.例如,`私人接口HasA {public void a(); 然后``HasA object = new HasA(){public void a(){...}};`. (2认同)

Iva*_*van 20

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

在第一个选项中,您基本上创建了扩展的匿名类的新对象java.lang.Object.那个匿名类有额外的方法a(),这就是你可以调用它的原因.