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

Fra*_*ani 3 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) {

    }
}
Run Code Online (Sandbox Code Playgroud)
public class Fireball extends Spell {
    @EventHandler
    public void onChat(PlayerChatEvent event) {

    }
}
Run Code Online (Sandbox Code Playgroud)

一般来说,既然this是指当前实例,那么Fireball.onChat(PlayerChatEvent)注册的可能性如何呢?

Jon*_*eet 5

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

因为当你构造一个实例时Fireball,this指的Fireball是在执行时构造的.在编译时的类型thisSpell的,但如果你打印出来this.getClass()(即使是在Spell构造函数),它会显示Fireball.

因此,如果registerEvents查看对象的执行时类型并使用反射查找事件处理程序,它将会看到onChat.