0

我知道 Java 接口用于声明将在更多类中使用的方法,因为这些类实现了它们。例如:

public interface MyInterface{

   void myVoidMethod();  
   Bool myBoolMethod(int x);  
   String myStringMethod(String a,String b);

}

因此,据我了解,它主要用于确保在类中声明某些方法,并且这些方法通常是更通用的方法,并且可能会应用于更多类。但是那些应该已经包含一些代码并且应该应用于更多类的方法呢?
例如,如果我有很多需要myBoolMethod定义为的类怎么办

Bool myBoolMethod(int x){
return x?0:1;}

(我只是举了一个简单的例子,但显然我需要使用更复杂的方法)。我听说过“代码注入”并且我很确定它与它有关,但我不知道如何走得更远,我也不知道该怎么做才能在不同的地方重写相同的代码。

4

5 回答 5

1

您正在寻找抽象类和继承。有关继承和在super此处使用关键字的更多信息:http: //docs.oracle.com/javase/tutorial/java/IandI/super.html

于 2013-02-27T12:35:11.477 回答
1

不必要。它也用于测试。如果您没有接口,则无法为测试目的提供自定义实现。另一个问题可能是“接口代码而不是实现”范式。让我举例说明:

假设你有一个ArrayList字符串:

ArrayList<String> list = new ArrayList<String>();

您在代码中使用它,但后来您发现您需要 aLinkedList因为它对您的问题更有效。

现在会发生什么?你必须在很多地方重构你的代码。但是,如果您List首先使用了该接口,则可以在不关心其实现的情况下将其传递出去,因此,如果您后来发现需要 aLinkedList而不是 an ArrayList,则只需在一个地方进行修改:

List<String> list = new LinkedList<String>();

如果您需要跨类方法,您可以创建一个abstract类并为您的interface. 如果您不覆盖它,它将在您的所有实现类中共享。

于 2013-02-27T12:35:51.980 回答
1

使用 java 7,您必须使用抽象类来为方法提供默认实现。无法在接口中定义对象的某些行为。

使用 java 8,您将能够为接口中的方法提供默认实现。

于 2013-02-27T12:33:57.920 回答
1

如果您希望确保类具有已经实现的某些方法,那么您希望使用Abstract Class

接口只是一个契约,它规定当一个类同意实现该接口时,它必须为这些方法提供一个实现。当您希望通过让对象通过接口而不是通过对象的直接方法引用您的类来鼓励代码中的松散耦合时,这很有用。

于 2013-02-27T12:34:13.930 回答
1

一个界面很有用(从实践经验来看),您想指定某个变量/参数应该符合其他一些海报提到的合同,而不是额外的。例如,你有一个被注入的资源(比如一个数据源),但你不想指定它是否应该是一个连接到一个 MySQL DB、一个 SQL Server DB 或一个你将要访问的虚拟数据源仅用于测试而不影响实时数据。因此,您将类型指定为接口类型,并在运行时注入适当实现类型的实例。如果您有兴趣,可以在 Google 上搜索一些注入 (CDI) 教程。

在其他情况下,您宁愿使用超类(抽象与否)。正确答案是:视情况而定,最好阅读(然后复习)有关 Java 语言基础的理论和书籍,以便能够针对您的特定情况做出最佳选择。

于 2013-02-27T12:45:38.923 回答