如何使用Java接口?

时间:2013-10-08 23:59:31

标签: java implements

我是一名初学Java程序员,并且在使用Java语言掌握OOP实现的大局时遇到了困难。

我将尝试使用下面的伪代码构建我的问题(如果它不是那么漂亮道歉):

interface{
  foo();
}

class a {
  //stuff
  foo() OPERATIONS;
}
class b {
  //stuff
  foo() OPERATIONS;
}

//The OPERATIONS segment is actually the *work* the foo does: i.e., if foo were 
//print, it would be the System.out.println("");

现在,接口的目的是什么,如果它在实际的类中,接口的'foo'OPERATIONS被声明?我认为接口的目的是创建一个“方法抓包”,它不在所有类混淆之外,以防止必须重构可在代码的一部分中修改的层次结构并应用于许多实施课程。换句话说,我想象一个接口就像一个函数将用于'C'语言:一个隔离和简洁的操作集合在一起并封装在需要时调用,并分组在一个代码段中,以便可以在界面内修改foo的OPERATIONS,它适用于实现界面的所有类。我错过了什么?

谢谢!

8 个答案:

答案 0 :(得分:3)

接口指定关于类的作用的合同,但不指定它是如何做的。想象一下排序算法,可能有很多实现。

public interface Sorter {

    void sort(List<String> list);

}

您可以使用冒泡排序,合并排序,快速排序等

但作为分拣机的使用者,我可能不在乎。

class SortClient {

    SortClient(Sorter sorter, List<String> list) {
      sorter.sort(list);
    }

}

SortClient并不关心你如何排序,只是它被排序。

在执行依赖注入的框架(如Spring或Guice)中,这变得非常重要。这些框架允许您配置使用哪个实现而无需更改其用户。

接口还有其他实际用途。它们对于创建用于测试的模拟/存根非常有用。在上面的SortClient案例中,您可能想为分拣机创建一些存根,例如:

ExceptionThrowingStubSortClient implements Sorter {
   void sort(List<String> list) {
      throw new SortException("Testing the exception handling");
   }
}

答案 1 :(得分:2)

首先阅读What is an interface?

基本上,接口是一个契约,声明interface的所有实现都保证提供interface描述的方法的实现。应该注意的是,实现可能决定实现一个空方法而不是提供一个实际的编码实现,这取决于实现,但它确保可以在实现时调用interface描述的方法界面。

例如......

public interface Foo {
    public void doBar();
}

声明foo的任何实现必须提供一个名为doBar的方法,该方法不返回任何内容(void)......

interface无法实例化

意思是你无法做到

Foo foo = new Foo(); // Compiler error...

但您可以在具体的interface ...

中实施class
public class FooBar implements Foo {
    public void doBar() {
        // Functional implementation of doBar...
    }
}

现在允许我们创建FooBar ...

的实例
FooBar fooBar = new FooBar();
fooBar.doBar();

您还可以将Foo的任何实施视为Foo的实例......

Foo foo = new FooBar();
foo.doBar();

(ps-是的,我知道,从技术上讲,这不是Foo的实例,而是简单的FooBar,就像Foo;))

这是Polymorphism

的核心

这使您可以解析代码,因为您的代码不需要关心Foo的实现,只需要他们可以与Foo进行交互。

这也允许您限制对实现的访问,这意味着因为Foo只定义了方法doBar,所以任何期望Foo实现的方法都无法然后调用任何其他方法doBar

(ps-是的我知道有办法解决这个问题,但意图是,你不应该!)

这是Program to an interface, no an implementation

的核心

答案 2 :(得分:2)

java中的

Interface就像是与实现class的契约。实施界面时,您必须确保实施interface中的所有方法或制作课程abstract。让我们采取类似的方式。

你正在创造一辆汽车。现在你知道那里可以有很多车,比如梅赛德斯,宝马,奥迪等等。您想确保每辆车都应包含changeGear()hasWheels()hasDoors()方法,那么您如何在所有可能的车辆上强制执行此标准。只需创建一个名为interface的{​​{1}},其中包含所有这些方法,如

Car

现在,实现此public interface Car{ boolean changeGear(); boolean hasWheels(); boolean hasDoors(); } 的每个class都必须实现所有这些方法。因此,将来如果您创建一个实现Car接口的interface类,它必须遵守此合同。

编辑:这里需要注意的是,实现Ferrari的所有类都不限于仅使用接口中的方法。就像实现interface必须确保它至少实现class中的方法一样。就像在我们的示例interface中一样,类可以很好地实现仅Ferrari类中包含的isSportCar()方法。

答案 3 :(得分:1)

java中的接口用于为将要实现它的所有类设置合约,并为将要使用它来解决问题的所有类设置合同。 但不像你说的那样,它可以用作c或任何其他语言的可重用函数,因为java中的所有函数/方法都封装在一个类中。

接口是抽象方法的集合,类实现接口,继承接口中声明的所有抽象方法。 接口与类有一些相似之处,但接口不是类。例如, 接口无法实例化,并且不能包含任何实例字段,并且只能包含静态最终字段等常量字段。

答案 4 :(得分:1)

java接口的目的是模拟不同对象之间可能存在的特定行为。 就像一个人可以弹跳一样,一个球也是如此,所以两个不同类别的物体,即一个人和一个球之间的弹跳行为很常见

在上面的伪代码中, foo 界面可以描述类 a &amp;的 B'/强>

像:

interface Foo{
  void bounce();
}

class A implements Foo {
 public void bounce() {
       System.out.println("Class A instance is bouncing");
 }
}

class B implements Foo {
 public void bounce() {
       System.out.println("Class B instance is bouncing");
 }
}

答案 5 :(得分:0)

相反,接口定义了一组可以从类中预期的行为。只是行为不是实施。让我用一个简单的例子。你已经上过驾驶汽车的课程,现在你已获得许可证,你可以驾驶汽车。你学会驾驶哪辆车?是燃气发动机还是柴油发动机?最重要的是,这有关系吗?

你学会了汽车的界面。既然您已经知道如何使用接口以及期望的行为,那么行为的实现方式并不重要。所以任何车型,任何发动机类型都可以。另请注意,您无需真正了解汽车发动机如何工作以驾驶汽车。

在软件界面中用于指定行为。然后在你的代码中你可以说我需要一个可以执行bar()操作的Foo对象。您不需要知道bar()的实现细节,只需要知道调用时的内容。

例如,您可能决定需要一个可能包含重复对象的List集合。在Java API中,有多个List实现,例如ArrayList和LinkedList。您可以编写使用List(接口)的代码,而无需担心哪个实现。这反过来又使您的代码更加健壮和可重用。

答案 6 :(得分:0)

在某些方面,Java interface就像一个C头文件:它声明了一个类在一个单独的文件中的方法/函数。

为什么这在面向对象系统中很有用?

这很有用,因为其他类可以实现接口,声明这些方法并以相同的方式使用它们并遵守这些方法的规则(方法契约)。其他代码只能使用接口调用这些对象,除了实现接口之外,可能不知道或关心实现的任何其他内容。

例如,java OutputStream(在技术上是一个抽象类,但我们可以假装它是本例中的接口)具有写入字节的方法

abstract class OutputStream{ 

   void write(int byte);

   void write(byte[] buffer);

   void close();

 }

OutputStream有几种实现,一些写入平面文件,一些写入内存数组,一些写入控制台数据。如果我们的代码使用OutputStream,我们不必关心如何自己完成所有这些事情,我们可以在编译时或运行时替换不同的实现,我们的代码仍然可以工作!

答案 7 :(得分:-1)

以下是Oracle关于接口的文档的引用:

  

interface Bicycle {

//  wheel revolutions per minute
void changeCadence(int newValue);

void changeGear(int newValue);

void speedUp(int increment);

void applyBrakes(int decrement); 
     

}

要实现此接口,您的类的名称将更改(例如,对于特定品牌的自行车,例如ACMEBicycle),并且您将在类声明中使用implements关键字:

  

类ACMEBicycle实现了Bicycle {

// remainder of this class 
// implemented as before 
     

}

以下是link了解详情。

希望它有所帮助!