我正在使用Bukkit API创建Minecraft插件。可以像这样调用和使用Player接口:
Player p = [insert player here];
String name = p.getName();
但是,由于Player是一个只有方法而不是方法体的接口,当你执行p.getName()方法时,接口如何知道要做什么方法?接口中有该方法,但是没有定义要执行的代码?据我所知,你必须在类中定义你的接口,但由于你可以有多个类实现相同的东西,如何调用这样的接口返回名称?我错过了什么?
感谢您的时间。
答案 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
。