java中的接口

时间:2013-06-25 10:53:09

标签: java

代码1:

public class User1 implements MyInterface
{
    @Override
    public void doCalculation() { }
}

public class User2 implements MyInterface
{
    @Override
    public void doCalculation() { }
}

interface MyInterface
{
    public void doCalculation();
}

代码2:

public class User1
{
    public void doCalculation() { }
}

public class User2
{
    public void doCalculation() { }
}

在我的代码1 中,我MyInterface有一个空方法doCalculation()。 user1和user2通过实施doCalculation()使用MyInterface

在我的代码2 中,我有两个不同的类,定义了doCalculation()方法。

在code1和code2两种情况下,我自己都要编写实现。我的方法doCalculation()只是一个空方法。

那么MyInterface在这里的用途是什么?

  1. 它只提供方法名称或骨架(这是界面的唯一优势)?

  2. 否则我会在使用MyInterface时保存内存吗?

  3. 是吗,它只为实现它的类提供了空方法,那么为什么不像我在code2中那样自己定义它。

  4. 使用界面还有更多优势。

9 个答案:

答案 0 :(得分:3)

接口被大量使用,因为它们基本上是您的课程应该能够做的蓝图。

例如,如果您正在编写带有字符的视频游戏,则可以使用一个界面来保存角色应具有的所有方法。

例如

public interface Character {
    public void doAction();
}

你有2个角色,例如盟友和敌人。

public class Ally implements Character {
    public void doAction() {
        System.out.println("Defend");
    }
}

public class Enemy implements Character {
    public void doAction() {
        System.out.println("Attack");
    }
}

如您所见,两个类都实现了接口,但它们具有不同的操作。 现在,您可以创建一个实现您的界面并让它执行其操作的角色。根据它是敌人还是盟友,它会执行不同的行动。

public Character ally = new Ally();
public Character enemy = new Enemy();

在你的主程序中,你可以创建一个方法来接受任何实现你的界面的对象,让它执行它的动作而不知道它是什么类型的角色。

void characterDoAction(Character char) {
    char.doAction();
}

如果您愿意为此方法提供联盟,则输出为:

Defend

如果你想给这个方法的敌人,输出将是:

Attack

我希望这是一个足够好的例子来帮助您了解使用接口的好处。

答案 1 :(得分:2)

界面驱动编程有很多优点。

What does "program to interfaces, not implementations" mean?

基本上你是在界面中定义一个契约,所有实现界面的类都必须遵守契约。

您的查询答案:

1.它只提供方法名称或骨架(这是界面的唯一优势)?

- >它不仅仅是提供方法名称,还定义了实现接口的类可以做什么。

2.使用MyInterface时我还能保存任何内存吗?

- >与记忆没什么关系

  1. 是吗,它只为实现它的类提供了空方法,那么为什么不像我在code2中那样自己定义它。 - >看看界面驱动编程的优势。
  2. 4.除此之外,使用界面还有更多优势。 - >很多,特别是依赖注入,模拟,单元测试等。

答案 2 :(得分:1)

这里可以找到一个非常好的解释when-best-to-use-an-interface-in-java。这实际上取决于您正在构建的内容以及您希望/不希望拥有多少可伸缩性,代码重复等。

答案 3 :(得分:1)

许多类使用接口来执行某些功能,依赖于其他程序员来实现与接口管理的契约相关的接口。例如,这些类是 KeyListeners,MouseListeners Runnable 等。

例如:JVM知道如何处理Thread,如何启动它,停止它,操纵它,但它不知道你的Thread应该做什么,所以你必须实现Runnable界面。


接口为您提供了一个抽象级别,可以在其他类中使用。例如,如果您有一个名为GemetricFigure的接口,则在打印GeometricFigure girth 的类中,您可以迭代所有 GeometricFigures的列表喜欢:

public class Canvas {

   private List<GeometricFigure> figures;

   public void print() {
       for (GeometricFigure figure : figure) {
           System.out.println(figure.getGirth());
       }
   }

}

如果GeometricFigure只有那个方法:

public interface GeometricFigure {

    public Double getGirth();

}

您不关心SquareCircle如何实现该界面。否则,如果没有接口,则Canvas中没有 GeometricFigures 的列表,而是每种数字类型的列表。

答案 4 :(得分:0)

接口就像您的实现类应该满足的契约。通常,您将编写一个接口,并使其他所有类使用自己的实现来实现它。

示例:

interface IExporter {
    public void export();
}

public class PDFExport implements IExporter {
    public void export(){
    //code for PDF Exporting
    }
}

public class XLSExport implements IExporter {
    public void export(){
    //code for XLS Exporting
    }
}

public class DOCExport implements IExporter {
    public void export(){
    //code for DOC Exporting
    }
}

答案 5 :(得分:0)

使用界面方法,您可以执行以下操作:

List<MyInterface> list = new ArrayList<MyInterface();

list.add(new User1());
list.add(new User2());

for(MyInterface myInterface : list) {
    myInterface.doClaculation()
}

这不适用于第二种方法。接口用于使用您的类的代码 - 不适用于您自己的类。

答案 6 :(得分:0)

在许多情况下,您可以使用接口。您所描述的情况也是如此:您无需了解您拥有的实施方案。

例如,你的代码中有一个方法,即使你不知道它是User1还是User2实现,它返回用户当前烧尽的方法,但是它们都可以通过方法doCalculation来计算。我添加了一个非常虚拟的例子:

public void dummyExampleCalculation() {

   getCurrentUser().doCalculation();

}

public MyInterface getCurrentUser() {

   if(...) {
      return new User1();
   } else {
      return new User2();
   }

}

答案 7 :(得分:0)

这就是面向对象编程的全部内容。Interfaces are used to perform polymorphism。你说过,你可以在这两个类的code2中实现,如果将来有需要doCalculation的user3会怎么样。您可以实现该界面并以自己的形式编写calculation

如果您想为所有用户提供基本功能abstract classes,您可以在其中声明一个抽象方法do calculation,并提供每个用户将扩展的基本功能的实现,可以doCalculation以自己的方式。

答案 8 :(得分:0)

Java中的接口用于对类强制实施规则。这意味着您可以在接口中声明函数的签名,然后通过完全遵循函数签名在各种类中实现这些函数。

您可以在以下网页上看到一个清晰逼真的示例

http://www.csnotes32.com/2014/10/interface-in-java.html