在Java中,接口从何处获得其方法体?
我正在使用BukkitAPI创建Minecraft插件。可以像这样调用和使用播放器界面:在Java中,接口从何处获得其方法体?,java,interface,bukkit,Java,Interface,Bukkit,我正在使用BukkitAPI创建Minecraft插件。可以像这样调用和使用播放器界面: Player p = [insert player here]; String name = p.getName(); 然而,由于Player是一个接口,它只有方法而没有方法体,当您使用p.getName()方法时,接口如何知道要执行什么方法?接口中有该方法,但没有定义要执行的代码?据我所知,必须在类中定义接口,但既然可以有多个类实现同一件事,那么这样调用接口如何返回名称?我错过了什么 谢谢您的时间。尽管
Player p = [insert player here];
String name = p.getName();
然而,由于Player是一个接口,它只有方法而没有方法体,当您使用p.getName()方法时,接口如何知道要执行什么方法?接口中有该方法,但没有定义要执行的代码?据我所知,必须在类中定义接口,但既然可以有多个类实现同一件事,那么这样调用接口如何返回名称?我错过了什么
谢谢您的时间。尽管
Player
本身就是一个接口,但在第一行之后引用的任何p
都是实现Player
接口的类的实例。正是这个类决定了调用getName()
的哪个实现。作为一个接口,Player
是一个抽象类型(用计算机科学术语)
实例将使用实现Player
的具体类型(可以实例化的类)。例如:
public interface Player {
public String getName();
}
public class StandardPlayer implements Player {
private String name;
public String getName() {
return name;
}
}
然后
变量p
在编译时与Player
接口相关联,但是p
引用的对象(实现Player
的某个具体类的实例)在运行时被绑定。这个对象包含方法的主体
请注意,p
可以引用实现Player
接口的任何类的实例。也就是说,在运行时,您将创建一些对象[insert player here]
,并且将执行该对象版本的getName
——不管是什么。(此外,在Java中,必须实例化Player
的一些实现;不能(逻辑上或法律上)直接创建Player
对象。)
在执行程序并创建Player
实例之前,这种所谓的延迟绑定不会发生。这是面向对象编程中的一个基本方面。播放器接口来自Bukkit API
Player
接口的主体在CraftPlayer
类中定义,该类来自服务器软件Craftbukkit
这是接口的魔力,您不介意实现细节只集中在它们做什么,而不是如何
是,但我想知道它们是如何工作的,以防我需要在代码中使用它们。@ConnorM看一下“使用接口编程”好吧,在某些地方,你必须通过依赖项注入、构造函数注入注入实际的对象引用p
,代码中的反射或实例化不可能在多个类中实现Player,因此在每个类中运行不同的代码吗?如果发生这种情况,它会同时运行两个方法吗?每个类一个?@ConnorM是的,多个类可以实现Player
接口p
但是,它总是引用实现它的特定类的实例。@ConnorM的思想是,为了执行该行,[insert player here]
部分必须返回一个对象,该对象是实现player
的类的实例。是那个类会为你“指定”它。哦,我想这是我不明白Bukkit在做什么的部分。我以为它只是返回了一个Player实例,但没有意识到它返回了它的一个实现。Thanks@ConnorM我以为它只是返回了一个Player的实例
没错,它返回了一个Player的实例。Player实例是Player接口实现的实例。你不能实例化一个接口!接口只是契约您不能直接创建玩家对象。
这意味着什么。。不清楚您是否实例化了实现Player
的类;您没有实例化播放器本身。现在我更喜欢新的编辑,我已经向您推荐xD
Player p = new StandardPlayer();