为什么“this”关键字也引用了子类?

时间:2015-06-18 14:41:20

标签: java oop this

在以下场景中,Main.registerEvents(Listener)是游戏API的事件系统的一部分。 假设它应该使用@EventHandler注释注册任何方法。

public abstract class Spell implements Listener {
    protected Spell() {
        Main.getInstance().registerEvents(this);
    }
    @EventHandler
    public void onMove(PlayerMoveEvent event) {

    }
}
public class Fireball extends Spell {
    @EventHandler
    public void onChat(PlayerChatEvent event) {

    }
}

一般来说,由于this是指当前实例,Fireball.onChat(PlayerChatEvent)如何注册?

3 个答案:

答案 0 :(得分:5)

  

一般来说,由于这是指当前实例,Fireball.onChat(PlayerChatEvent)如何注册也是可能的?

因为当您构建Fireball的实例时,this指的是在执行时构造的Fireball。 <{1}}的编译时类型为this,但如果您打印出Spell(即使在this.getClass()构造函数中),它也会显示{ {1}}。

因此,如果Spell查看对象的执行时类型并查找带反射的事件处理程序,则会看到Fireball

答案 1 :(得分:1)

在不知道API的实现的情况下,我只能猜测。

为了获得注释,必须首先使用Object.getClass()获取适用的类。这是多态的,因此返回Fireball.class,因此当反复搜索注释时,会找到Fireball中找到的注释和Spell中找到的注释。

答案 2 :(得分:0)

Fireball.onChat(PlayerChatEvent)也已注册,因为您使用super(),它正在调用超类的构造函数。

this始终引用类的实例,从中调用它。

由于不存在的构造函数与您在Fireball类中使用的构造函数的等效性,您应该能够省略Fireball构造函数而不会影响结果。

因此,最后每个法术子类中的每个@EventHandler注释方法都会被注册。