Java &引用;“异常方法”;有趣的行为

Java &引用;“异常方法”;有趣的行为,java,Java,我从这段代码开始,它没有编译: Object[] obj= new Object[2]; obj[0]=new Object () { public String compute() {return "yay 1!";} }; obj[1]=new Object () { public String compute() {return "yay 2!";} }; for (Object o : obj) System.out.println(o.compute()); 因为对象没有为

我从这段代码开始,它没有编译:

Object[] obj= new Object[2];
obj[0]=new Object () { public String compute() {return "yay 1!";} };
obj[1]=new Object () { public String compute() {return "yay 2!";} };

for (Object o : obj)
    System.out.println(o.compute());
因为对象没有为其定义的
compute()
方法。所以,我假设java抛弃了这个函数;然而,以下措施确实起了作用:

Object[] obj= new Object[2];
obj[0]=new Object () { public String toString() {return "yay 1!";} };
obj[1]=new Object () { public String toString() {return "yay 2!";} };

for (Object o : obj)
    System.out.println(o);
所以,java必须仍然将函数定义存储在某个地方,对吗?或者这是因为我正在重写
toString()

我的问题是如何告诉java存在
compute()

如果不可能做到这一点,我是否可以像在第一个示例中那样,重写对象中确实存在的方法?
compute()
实际代表的方法是一种接受
int
的方法。这可能很可怕,但我是否应该覆盖
等待(长l)

提前感谢。

Java没有“抛弃”该方法;您放入该数组中的实例拥有它,但Java的类型系统没有使外部代码可以使用它们的特性

例如,您可以通过反射来验证方法的存在性

如果您想要匿名类的更多方法,请定义一个合适的接口并使用
newmyinterface(){…}

Java没有“抛弃”该方法;您放入该数组中的实例拥有它,但Java的类型系统没有使外部代码可以使用它们的特性

例如,您可以通过反射来验证方法的存在性


如果您想要匿名类有更多的方法,请定义一个合适的接口并使用
newmyinterface(){…}

这就是所谓的匿名类

您定义了一个匿名类

new Object() { public String compute() {return "yay 1!";} }
之后你就不能用了

如果你宣布

class Child { // extends Object {

  public String compute() {return "yay 1!";}

}
那你就可以做了

for (Object o : obj)
    System.out.println(((Child)o).compute());

这就是所谓的匿名类

您定义了一个匿名类

new Object() { public String compute() {return "yay 1!";} }
之后你就不能用了

如果你宣布

class Child { // extends Object {

  public String compute() {return "yay 1!";}

}
那你就可以做了

for (Object o : obj)
    System.out.println(((Child)o).compute());

第二个有效是因为
toString
Object
的方法之一……第二个有效是因为
toString
Object
的方法之一……compute()实际代表的方法是一个取
int
的方法。这可能很可怕,但我是否应该覆盖
wait(long l)
以使其正常工作?没有理由覆盖
wait
@SteveP。如果您真的需要一个
compute
方法,为什么不用该方法定义一个接口,并将其实现为一个匿名本地类呢。因此,如果我定义一个接口并使用
newmyinterface(){…}
,它将告诉java方法存在,并且我可以根据自己的意愿调用该方法?是的,它就是这样工作的。数组也必须是
MyInterface[]
类型。compute()实际代表的方法是一个接受
int
的方法。这可能很可怕,但我是否应该覆盖
wait(long l)
以使其正常工作?没有理由覆盖
wait
@SteveP。如果您真的需要一个
compute
方法,为什么不用该方法定义一个接口,并将其实现为一个匿名本地类呢。因此,如果我定义一个接口并使用
newmyinterface(){…}
,它将告诉java方法存在,并且我可以根据自己的意愿调用该方法?是的,它就是这样工作的。数组的类型也必须是
MyInterface[]