我应该在什么时候使用java中的接口?

我应该在什么时候使用java中的接口?,java,interface,Java,Interface,一个很好的例子,说明什么时候具体地在Java中使用接口是理想的,并且适用任何特定的规则。当您需要相同行为的多个实现时,可以使用接口。下面是一个接口示例,对象可以实现该接口,以显示它们都可以序列化为XML public interface Xmlizable { public String toXML(); } 然后,您可以将“可Xmlizable”接口传递给只关心该接口的方法。一个好地方是集合框架 java.util.List //interface java.util.ArrayL

一个很好的例子,说明什么时候具体地在Java中使用接口是理想的,并且适用任何特定的规则。

当您需要相同行为的多个实现时,可以使用接口。下面是一个接口示例,对象可以实现该接口,以显示它们都可以序列化为XML

public interface Xmlizable
{
    public String toXML();
}

然后,您可以将“可Xmlizable”接口传递给只关心该接口的方法。

一个好地方是集合框架

java.util.List //interface

java.util.ArrayList //Concrete class
java.util.LinkedList //Concrete class
因此,您可以编写如下代码:

List l = new ArrayList();

l.add(..)
//do something else.
如果将来您想用
LinkedList
更改实现,或者您拥有实现List接口的
AwesomeList,您所要做的就是将第一行更改为:

List l = new MyAwesomeList();
or
List l = new LinkedList();

代码的其余部分将从头到尾。

请查看位于的JDK collection教程。想想收藏。你想到了什么?可以订购,也可以不订购,也可以有重复件

所以集合是一个接口,列表(有序)和集合(无序)作为子接口。现在有很多关于列表的问题,是否应该同步,是否应该是链表等等。每个“行为”都有自己的接口/抽象类

当您想要在集合中指定“某些”行为时,需要抽象类。例如,所有集合(集合/列表等)都可以有一个“toString”表示,它只是在元素上迭代(有序/不有序)并将其字符串化。这种行为可以出现在“AbstractCollection”等中


如果您遵循JDK集合的层次结构,那么它是学习接口和抽象类的绝佳场所:)

尝试理解使用接口定义“第三方”供应商必须完全遵守和实施的应用程序编程契约(蓝图、接口)。这样,最终用户就可以根据API合同编写代码,并在不更改代码的情况下轻松地“秘密”切换具体实现

这是一个很好的例子。它几乎只存在几个接口。具体实现作为“JDBC驱动程序”提供。这使您能够独立于数据库(DB)供应商编写所有JDBC代码。只要您想切换数据库供应商,就可以更改JDBC驱动程序,而无需更改任何一行Java代码(除了任何硬编码的DB特定SQL代码)


另一个例子是,它还包含很多接口和抽象类。具体实现以“Java EE应用程序服务器”、“Servletcontainers”等形式提供,如Sun Glassfish、Apache Tomcat等。这使您能够将web应用程序(WAR)部署到您喜欢的任何Java web服务器。

基本上,您可以在需要“省去”时在接口和抽象类之间进行选择一些实现细节。接口通常是更好的选择,因为客户机类可以实现任意数量的接口,但它们只能有一个超类(“继承是一种稀缺资源”,正如他们所说)

为什么要抽象类或接口?因为有时候,当你编写一个算法时,你并不关心它的一个子步骤是如何完成的,只是它是根据某种契约完成的。一个例子是Collections API,其中List是一个接口——通常,当您使用
List
时,您并不真正关心它是在数组中保存内容,还是在节点的链接列表中保存内容,或者以其他方式保存内容。只要它按照你放进去的顺序来存储你放进去的东西,你就很开心

然后我们有了
AbstractList
:一个实现
List
的抽象类,它提供了一个成熟的
List
所需的几乎所有东西的实现——要创建自己的
List
实现,您所要做的就是扩展
AbstractList
并填充一些方法。这是一个很好的例子,说明抽象类是一个很好的选择——当您想要提供一个几乎完整的实现时,它只缺少一些需要由客户机代码填补的空白


提示:如果创建一个只包含抽象方法的抽象类,则可能应该为其创建一个接口。

当您计划在某个开发点用另一个类替换一个实现类时,请使用接口

我还建议对继承关系中的所有类使用接口后端,至少在更严肃的项目中是这样:不幸的是,我不再有这种链接,但Java语言的一位开发人员曾经说过,包括类继承是设计语言时最大的错误


这些论据非常好:使用适当的设计,总是可以用接口继承代替类继承,并且您在代码维护方面获得了很多好处。与类继承相比,保留自然类型关系(例如从几何体(“正方形是矩形”)更容易。

OOP的一个基本原则是信息隐藏:隐藏实现细节,只向调用者显示基本服务的描述

Java必须为这个目标而构造:接口和抽象类。您可以定义一个接口,并编写代码,通过调用其中定义的“可用方法”,它只依赖于接口

信息隐藏既可用于读取外部类(从某种意义上说是外部的,即它位于您正在编写的模块之外)-通过这种方式,您可以定义所需的方法,并且无需推断其具体实现类型,或者在定义可在类之外使用的数据类型时-这方面的典型示例是集合API或J2EE,正如其他已经提到的

接口和抽象类都提供了这些细节——但有两个主要区别:接口
SomeReader someReader = new SomeReader();
String data = someReader.readLine();
System.out.println(data);
IMyReader reader = new SomeReader();
System.out.println(reader.readLine());
public class RowPrinter {

    private final IMyReader reader;

    public RowPrinter(IMyReader reader) {
        this.reader = reader;
    }

    public void print() {
        IMyReader reader = getReader();
        System.out.println(reader.readLine());
    }

    protected IMyReader getReader() {
        return reader;
    }
}