在JAVA中将引用变量声明为接口类型有什么好处?

what is the advantage of declaring a reference variable as an interface type in JAVA?

本问题已经有最佳答案,请猛点这里访问。

我在看PowerPoint演示文稿时遇到了:

When you call a method through one of these references, the correct version will be called based on the actual instance of the interface being referred to. This is one of the key features of interfaces. The method to be executed is looked up dynamically at run time, allowing classes to be created later than the code which calls methods on them.

有人能给我解释一下这个概念吗?我提到的网站和书籍很少,我仍然不清楚这个概念是如何运作的。从上面的行可以知道,它调用了正确版本的方法。它是如何工作的,什么时候我应该将对象强制转换为接口类型。


我们来举一个使用List接口的例子。它的两个实现是ArrayListLinkedList。第一种方法在检索随机元素(例如使用get(6)方法的第6种方法)时非常快,但在添加和删除元素时却很慢。第二个是相反的。添加和删除的速度快,但访问随机元素的速度慢。

现在假设您有一个类,该类具有检索汽车经销商信息的方法。一种方法检索所有可用汽车制造商的列表,另一种方法检索经销商拥有的所有汽车。在第一种情况下,您希望使用ArrayList,因为您不希望制造商列表发生如此大的变化,而在第二种情况下,您希望使用LinkedList,因为您希望销售和购买大量的汽车,从而做出许多变化。

然而,使用这些方法的人并不真正关心他是处理ArrayList还是处理LinkedList。他只想使用get(x)add(Car)remove(Car),这些都是List接口的方法。因此,您的方法都应该使用List作为返回类型,它们将决定提供什么实现,因为调用它们的方法并不重要。

这也使您能够在将来更改第二种方法,例如,如果您决定需要快速检索而不是快速添加和删除,则可以将第二种方法从提供LinkedList更改为ArrayList。如果方法显式返回LinkedList,那么您将不得不去更改它被调用到新类型中的所有位置。但是如果它只是返回接口,那么不需要进行外部更改!