创建对象时声明方法

时间:2018-12-28 15:21:20

标签: java object methods anonymous-class anonymous-inner-class

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


第一种方式:

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

第二种方式:

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

object.a();

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

4 个答案:

答案 0 :(得分:43)

java.lang.Object没有声明(2)的a方法,而the class instance creation expression new Object() { public void a() {} }返回的匿名类具有(1)。

使用Java 10的local variable type inferencevar)使第二个选项与第一个选项一样有效。

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

答案 1 :(得分:21)

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

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

答案 2 :(得分:2)

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

您可以做的是使用反射获得object的方法,如下所示:

Object object = new Object() {
  public void a() {
     System.out.println("In a");
  }
}

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

这将打印

  

答案 3 :(得分:0)

别担心,您将需要进行一些更正 两种都是访问类的私有成员的方法。通过第一种方法,您不必预先声明method.ex:-

public class demo {

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

}

}

但是通过使用第二种方法,您将必须显式声明方法a();。无论是在抽象类还是在接口中,您都可以覆盖它。像:-

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();


}

}

我希望这会有所帮助。