2014-01-14 45 views
0

我正在使用Bukkit API創建Minecraft插件。播放界面可以調用,使用像這樣:接口從Java中獲取其方法體的位置?

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

然而,作爲球員是一個接口,其中只有方法,而不是方法體,怎麼能一個接口知道什麼時候你做的做的方法p.getName()方法?該接口有它的方法,但沒有定義代碼來執行?據我所知,你必須在類中定義你的接口,但是因爲你可以有多個類實現相同的事情,所以如何給接口調用返回名稱?我錯過了什麼?

謝謝你的時間。

+0

這就是界面的魔力,你不介意實現細節只關注於'他們做什麼'而不是'怎麼' – nachokk

+0

是的,但我想知道他們是如何工作的,以防我需要使用一個在我的代碼中。 –

+0

@ConnorM看看「編程與接口」 –

回答

4

儘管Player本身就是一個接口,不管p指的是在第一行是實現接口的類的實例之後。正是這個類決定調用getName()的哪個實現。

+0

注入實際對象引用'p'是不是可以實現播放器不止一個類,因此在每個類中運行不同的代碼?如果發生這種情況,它會運行兩種方法,一種來自每個班級嗎? –

+0

@ConnorM是的,多個類可以實現'Player'接口。然而,'p'將始終引用一個* specific *類的實例來實現它。 –

+0

如果它指的是實現它的特定類,它如何決定使用哪一個?如果有多個類實現它,我需要指定哪一個? –

1

作爲接口,Player摘要類型(以計算機科學術語來說)。

A 具體類型(一個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(); 
2

變量pPlayer接口在編譯時通過p相關,但事情被引用 - 實現Player一些具體的類的實例 - - 在運行時綁定。這是包含方法體的這個對象。

請注意,p可以指的是實現Player接口的任意類的實例。也就是說,在運行時,您將創建一些對象[insert player here],它的對象的版本getName - 無論那是什麼 - 將被執行。 (此外,在Java中,你必須實例的Player一些實施;不能(在邏輯上或法律上)直接創建Player對象。)

這種所謂末結合不會發生,直到程序執行並創建Player實例。這是面向對象編程中polymorphism的一個基本方面。

+0

'你不能直接創建一個Player對象。'這意味着什麼..不清楚 – nachokk

+0

你實例化了實現'Player'的類;你不會實例化一個'Player'本身。 –

+1

現在,我更喜歡它與新的編輯,我已upvote你xD – nachokk

0

Player接口來自Bukkit API。

Player接口的主體在CraftPlayer類中定義,該類來自服務器軟件Craftbukkit