2012-09-05 202 views
0

這聽起來像一個愚蠢的問題,但它加重了我,因爲我不明白聲明方法的位置。在我的代碼,我可以做這樣的事情(這顯然是有點僞代碼)如何聲明返回的接口對象聲明其方法

ResultSet rs = DB.getConnection.sendSQL(select * from [table]) 

據我所知,SQL的發送返回「結果集」,雖然一個「結果集」只是一個接口返回對象實現了該接口。

我的問題是如何返回對象實現該接口?從我讀的界面只能定義一個方法簽名,而不是一個完整的函數。

那麼功能定義在哪裏?顯然不在ResultSet接口!我正確理解這是數據庫驅動程序的工作嗎? (我想我可能只是回答了我自己的問題)。

我可以使用全功能方法編寫接口嗎?任何實現類都會自動實現該方法,還是隻是通過調用「超級」或其他方法來覆蓋它?

我剛剛在SO How does abstract method of predefined interface like Connection, Statement etc. perform some task without having body? 上發現了這個問題,這是一個完美的重複,但很多bette制定。和一個很好的回答

回答

1

實現接口的類負責聲明接口中的所有方法,並在適當的地方實現這些方法的內部邏輯。

該接口實質上是說「你必須爲此提供功能,但我不在意你如何做到這一點,你只需要輸入這些類型並提供這種類型的輸出。該課程是您實施如何從輸入到輸出的地方。

+0

我有點理解,我只是突然意識到,我正在從將SQL發送到數據庫的結果中獲取resultSet對象。所以我想知道在哪裏創建了ResultSet對象,以及接口是否能夠確定方法的某些功能。這也解釋了爲什麼經常有抽象類實現一個接口,所有的方法體都是「空的」。 – DaveM

+0

@DaveM你沒有得到一個ResultSet對象,你得到一個對象,它是一個實現了ResultSet接口的類的實例。 –

+0

所以實際上我得到了'對象的一部分'。所以我的被調用的對象可能有一個實現接口的成員,或者可能暗示它自己。如果被調用的對象實現了接口(也可能是其他的 - 這裏聲明對象可能實現metaData和結果集),當'實現接口的對象'被返回時,我想我只能訪問接口的那些方法,而不是任何其他人在被調用的類中,這是正確的。 – DaveM

1

我的問題是如何返回的對象實現該接口?

class ResultSetImpl implements ResultSet { ... } 

從我讀的接口只能定義一個方法的簽名,不是一個完整的功能。那麼定義的功能在哪裏?顯然不在ResultSet接口!

在返回的對象中。在點;-)

這是基本的Java。

+0

那麼ResultSetImpl {...}是否在數據庫驅動程序中? – DaveM

1

讓我們以下面的情況:

我們有一個接口:

public interface Expendable(){ 
    public void expend(); 
} 

和實現它的類:在方法的對象

public class MyClass implements Expendable(){ 
    public void expend(){ 
//Do something 
} 
} 

而另一個類返回該實現我們的接口:

public class OtherClass(){ 
    public Expendable myMethod(){ 
    return new MyClass(); 
} 
} 

OtherClass myMethod返回一個實現Expendable接口的對象(我們不知道是什麼Class它只是通過查看方法返回類型)。當前的Expend方法在myMethod正在返回的實際類中定義。在這種情況下,如果您需要調用方法

new OtherClass.myMethod().expend(); 

是MyClass支出方法。

+0

因此,數據庫驅動程序正在驅動程序的內部工作中實現接口。我越想這個,就越覺得它更奇怪/抽象。可能是因爲我很少編寫接口,而且都不會返回實現它們的對象!這是不好的,還是隻是不尋常的? – DaveM

+0

我建議您閱讀有關接口的更多信息:http://docs.oracle.com/javase/tutorial/java/concepts/interface.html http://tutorials.jenkov.com/java/interfaces.html – Averroes