关于java:创建对象时声明方法

Declaring a method when creating an object

为什么第一种方法正确,第二种方法不正确?

第一种方式:

1
2
3
4
5
new Object() {
    public void a() {
        /*code*/
    }
}.a();

第二种方式:

1
2
3
4
5
6
7
Object object = new Object() {
    public void a() {
        /*code*/
    }
};

object.a();

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


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

使用Java 10的本地变量类型推断(EDCOX1×7)来使第二个选项与第一个选项一样有效。

1
2
3
4
var object = new Object() {
    public void a() {}
};
object.a();


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

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


Java是静态类型的。当你说object.a()时,它在Object类中寻找不存在的方法a。因此它不编译。

您可以使用反射得到Object的方法,如下所示:

1
2
3
4
5
6
7
8
Object object = new Object() {
  public void a() {
     System.out.println("In a");
  }
}

Method method = object.getClass().getDeclaredMethod("a");
method.invoke(object, null);

这个会印出来的

In a


别担心,你得做些修正两者都是访问类的私有成员的方法。通过使用第一种方法,您不必预先声明method.ex:-

1
2
3
4
5
6
7
8
9
10
11
12
13
public class demo {

    public static void main(String[] args) {
    new Object() {
        public void a() {
            /*code*/
            System.out.println("Hello");
        }
    }.a();

}

}

但是通过使用第二种方法,您必须在抽象类或接口中显式声明方法a();然后您可以重写它。像:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
interface Object
{
public void a();
}
class demo {

public static void main(String[] args) {
    Object object = new Object() {
        public void a() {
            System.out.println("Hello");
        }

    }; object.a();


}

}

我希望它能有所帮助。