2012-01-18 56 views
4

在代码中,当您在飞行中创建实例时,它在Java中称为什么?

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的方法,或者是否重新定义了它的方法,但我不知道要寻找什么来寻找答案 - 并且不知道要问什么问题而不知道它是什么当您即时创建对象的新实例并给它一个实现时调用。

回答

9

你正在创建一个匿名内部类即是MyObject一个子类,所以是的,你是重写doThing方法,如果是,你问什么。

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

如果你想自己去尝试,你可以使用该方法的myObjectgetClass()并提取有关它的信息,如姓名,父,实现的接口,通用参数等

3

这就是所谓的匿名内部类。

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

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

1

在Java中,所有非final实例方法都可能被覆盖(即虚拟)。这同样适用于内部类,因此您的代码将覆盖MyObjectdoThing()方法。

1

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

相关问题