在动态创建实例时,在Java中调用了什么?

时间:2012-01-18 14:28:36

标签: java language-features anonymous-class

在代码中,

class MyObject {
   public String doThing() {
      return "doh";
   }
}

class MyClass {
   private myObject = null;
   public MyClass() {
       myObject = new MyObject() {
           public String doThing() {
              return "huh?";
           }
       };
   }

为myObject分配新对象时调用了什么?我在技术上试图找出'doThing'是否覆盖了MyObject中的方法,或者是否重新定义了它,但我不知道要搜索什么来找到答案 - 并且不知道在不知道它是什么的情况下要问什么问题在动态创建对象的新实例并为其提供实现时调用。

5 个答案:

答案 0 :(得分:9)

您正在创建一个匿名内部类,它是MyObject的子类,所以是的,您正在覆盖doThing方法,如果是您要求的那样。< / p>

顺便说一句,匿名类就像命名类一样,它们在.class文件中有自己的字节码,它的名字就像它们的后缀类,后缀是美元符号和数字。

如果您想自己进行实验,可以使用getClass()的方法myObject并提取有关它的信息,如名称,父级,已实现的接口,通用参数等。

答案 1 :(得分:3)

这被称为匿名内部阶级。

鉴于doThing()方法与其超类中的公共方法具有相同的签名,它会覆盖它。

确保最好的方法是将@Override注释添加到子类中的方法:如果带有此注释的方法不覆盖任何方法,编译器将生成编译错误。

答案 2 :(得分:2)

此结构的名称为Anonymous inner class

您可以在Google上找到大量有关这些文档的文档

答案 3 :(得分:1)

在Java中,所有非最终实例方法都受到覆盖(即虚拟)。这同样适用于内部类,因此您的代码会覆盖MyObject的{​​{1}}方法。

答案 4 :(得分:1)

是的,覆盖了doThing()方法。这相当于一个匿名类,它继承了MyObject的行为,然后重写它。

相关问题