Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,接口从何处获得其方法体?_Java_Interface_Bukkit - Fatal编程技术网

在Java中,接口从何处获得其方法体?

在Java中,接口从何处获得其方法体?,java,interface,bukkit,Java,Interface,Bukkit,我正在使用BukkitAPI创建Minecraft插件。可以像这样调用和使用播放器界面: Player p = [insert player here]; String name = p.getName(); 然而,由于Player是一个接口,它只有方法而没有方法体,当您使用p.getName()方法时,接口如何知道要执行什么方法?接口中有该方法,但没有定义要执行的代码?据我所知,必须在类中定义接口,但既然可以有多个类实现同一件事,那么这样调用接口如何返回名称?我错过了什么 谢谢您的时间。尽管

我正在使用BukkitAPI创建Minecraft插件。可以像这样调用和使用播放器界面:

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();