2016-07-28 81 views
0

我不明白如果Path類本身是一個接口,如何創建一個Path對象。當Path是一個接口時創建一個路徑對象?

Path path = Paths.get("..."); 

我有一個真正的鬥爭,我也是一個初學者,所以請幫幫忙!

+0

請首先閱讀Java中的向上預測和向下轉換 –

+0

這是不是在做什麼?運行代碼時是否出現錯誤? –

+1

你可以看看這些答案:[這似乎是從一個界面創建一個對象;它如何工作?](http://stackoverflow.com/questions/3947708/this-appears-to-create-an-object-from-an-interface-how-does-it-work)[我們如何創建在java中的接口對象?](http://stackoverflow.com/questions/16880494/how-can-we-create-object-of-interface-in-java) –

回答

1

試想一下,下面的代碼是這樣的:

interface Path {} 
class PathImpl implements Path { 
    String path; 
    PathImpl(String path) { this.path = path; } 
} 
class Paths { 
    static Path get(String path) { return new PathImpl(path); } 
} 

所以,如果你Paths.get("abc")我的例子,你會收到一個new PathImpl("abc")它實現了Path接口。

+0

現在這段代碼帶給我另一個問題。 Paths中的get()方法返回一個Path值,但它是一個接口? 我有點笨,對不起 –

+1

get方法返回一個PathImpl,它是*是一個* Path。如果這個概念不清楚,你應該[閱讀繼承](https://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html)。 – assylias

+0

好吧,我明白你的意思了,只是一件事。最後,我上面的代碼中的'path'變量,它仍然是一個變量的PathImpl類型,剛剛上傳爲Path? –

0

assylias表示它返回一個PathImpl,其中是一個路徑。如果您對「is a」的含義感到困惑,請閱讀java中的inheritance

1

接口定義了Java中的類型。如果你得到一個類型爲Path的對象,編譯器會知道可能調用的方法。你還會知道你可能期望的方法。 Paths.get返回實現接口Path的類的實例。

你不知道實現類,你不應該知道它,所以你的代碼不依賴於實現細節。接口提供了實現「鬆耦合」的可能性。您可以使用接口並編寫調用其方法的代碼,即使仍然沒有實現(特別適用於自頂向下的方法)。接口使您可以有多個接口實現,它指定了所有實現必須實現的常見行爲。 ArrayListLinkedList是實現接口List的多個類的示例。這被稱爲多態性。許多標準包括指定行爲的接口。這允許存在多個stabdard實現。

+0

好的,但我對一件事感到困惑。當Paths.get從實現接口'Path'的類中返回一個對象,並將其分配給我的變量'Path path'時,'path'仍然是來自'PathImplClass'的對象嗎? –

+0

是的。路徑instanceof PathImplClass返回true。所以,你可以低調,但這通常是人們想要避免的,因爲它打破了鬆耦合。 PathImplClass仍然有所作爲,即使你不做下降,因爲它是實際的方法被調用。想象你在一家餐館。您可以在不知道將處理您的訂單的實際廚師的情況下點餐,但您知道他/她有方法訂單(餐食)。每個廚師都以自己的方式做飯,但他們每個人都準備好你的飯菜。 – mm759