根据我的理解,你编程到一个接口而不是一个具体的类来限制自己使用不属于接口的方法.这有助于您希望稍后更改所述接口的实现.(灵活性)即
List myList = new ArrayList(); // programming to the List interface
Run Code Online (Sandbox Code Playgroud)
代替
ArrayList myList = new ArrayList(); // this is bad
Run Code Online (Sandbox Code Playgroud)
是不是因为它们没有在List中定义而无法访问ArrayList中的方法(如trimToSize(),而不是List接口的一部分)的原因?它是否类似于一个类有一个公共全局变量但没有方法来访问它?
此外,如果你决定改变
List myList = new ArrayList();
//into
List myList = new LinkedList();
Run Code Online (Sandbox Code Playgroud)
你做出这样改变的唯一原因是性能(我没有看到其他原因)吗?因为在这两种情况下,您只能访问List定义的方法,不包括具体实现的额外功能.
人们使用接口来隐藏实现细节的细节。例如,我想编写一个返回集合大小的函数- 它可以是列表、数组、映射,任何东西,我不在乎。我将使用伪代码,它与 Java 无关:
int length (Collection c) {
return c.size();
}
Run Code Online (Sandbox Code Playgroud)
否则,我必须实现“map_length、list_length”和许多其他方法。这会极大地破坏你的代码。
另一个常见的例子——数据库。其中有很多具有不同的 API、请求语言、性能等。我不知道在您的应用程序中更喜欢使用哪一个。因此,您可以创建通用数据库接口并将其用作代码周围的“占位符”。当您将确切的数据库隐藏在界面后面时,您可以毫无问题地在各种数据库之间切换。
我建议您进一步阅读有关继承和模式的内容。