2016-07-28 50 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

相关问题