Interface在Java中从哪里获取其方法体?

时间:2014-01-14 01:21:21

标签: java interface bukkit

我正在使用Bukkit API创建Minecraft插件。可以像这样调用和使用Player接口:

Player p = [insert player here];
String name = p.getName();

但是,由于Player是一个只有方法而不是方法体的接口,当你执行p.getName()方法时,接口如何知道要做什么方法?接口中有该方法,但是没有定义要执行的代码?据我所知,你必须在类中定义你的接口,但由于你可以有多个类实现相同的东西,如何调用这样的接口返回名称?我错过了什么?

感谢您的时间。

4 个答案:

答案 0 :(得分:4)

尽管Player本身是一个接口,但在{1}}之后引用的是第一行是实现p接口的类的实例。正是该类确定调用Player的哪个实现。

答案 1 :(得分:2)

变量p在编译时与Player接口关联,但由p引用的东西 - 实现Player的某个具体类的实例 - 在运行时绑定。这个对象包含方法的主体。

请注意,p可以引用实现Player接口的任何类的实例。也就是说,在运行时,您将创建一些对象[insert player here],而 对象的getName版本 - 无论是什么 - 将被执行。 (此外,在Java中,您必须实例化Player的某些实现;您不能(逻辑上或合法地)直接创建Player对象。)

这个所谓的 late 绑定在程序执行并创建Player实例之前不会发生。这是面向对象编程中polymorphism的一个基本方面。

答案 2 :(得分:1)

作为一个界面,Player抽象类型(用计算机科学术语来说)。

实现class具体类型(Player,可以实例化)将用于实例。例如:

public interface Player {
    public String getName();
}

public class StandardPlayer implements Player {

    private String name;

    public String getName() {
        return name;
    }
}

然后

Player p = new StandardPlayer();

答案 3 :(得分:0)

Player接口来自Bukkit API。

Player接口的主体在CraftPlayer类中定义,该类来自服务器软件Craftbukkit