Java:难以理解接口(interface)的用途?

标签 java interface

我最近接触到了 Java 中的接口(interface),但我无法理解它们的用途。所以,假设我有以下内容:

//this is an interface
public interface DanceMoves {
    public void theJitterbug(int twists);
    public void theHustle(int steps);
    public void theMoonwalk(int slides);
}

然后我有一个实现这个接口(interface)的类:

public class DanceClub implements DanceMoves {
    public void theJitterbug(int twists) {
        System.out.println("Twist " + twists + " times!");
    }
    public void theHustle(int steps) {
        System.out.println("Step " + steps + " times!");
    }
    public void theMoonwalk(int slides) {
        System.out.println("Slide " + slides + " times!");
    }

    //more methods can go here

    public static void main(String[] args) {
        DanceClub letsDance = new DanceClub();
        letsDance.theJitterbug(5);
        letsDance.theHustle(4);
        letsDance.theMoonwalk(3);
    }        
}

也许我有另一种方法来实现这个接口(interface):

public class Diner implements DanceMoves {
    public void theJitterbug(int twists) {
        System.out.println("Twist " + twists + " times!");
        System.out.println("We only do the jitterbug in diners!");
    }

    public void theHustle(int steps) {
    }

    public void theMoonwalk(int slides) {
    }

    public static void main(String[] args) {
        Diner letsDanceAgain = new Diner();
        letsDanceAgain.theJitterbug(5);
    }
}

所以我的问题是,如果我们无论如何都必须重写所有接口(interface)方法,为什么我们还要费心去实现一个接口(interface)呢?这个代码重用如何?

编辑:非常感谢所有回答的人!我是 Java 新手,到目前为止我学过的唯一其他语言是 Jython。因此,虽然很多概念翻译得很好,但一些新的东西对我来说有点难以理解。

我也很欣赏下面给出的响应示例,以及指向先前问题和外部来源的链接。实际上,我之前已经阅读了大部分问题,并且查阅了外部资源,但在我能够更清楚地了解我实际阅读的内容后,它们会更有帮助!

但无论如何!我真正想做的是写下我关于界面的重要收获(为了我自己和子孙后代),看看我是否真的“明白”。我之前的问题是,如果我们无论如何都必须重写所有接口(interface)方法,为什么我们还要费心去实现一个接口(interface)呢?这个代码的重用性如何?。使用 Elliot Frisch 对我的示例的修改:

public interface Dance { //an interface
  public void boogie(int count);
}

现在,您可以拥有实现此接口(interface)的相关或不相关的方法 -

public class theMoonwalk implements Dance {
  public void boogie(int count) {
    System.out.println("Slide " + count + " times!");
  }
  public void mJ() {
    System.out.println("Michael Jackson did this dance!");

}
public class theHustle implements Dance {
  public void boogie(int steps) {
    System.out.println("Step " + steps + " times!");
  }
}
public class theJitterBug implements Dance {
  public void boogie(int twists) {
    System.out.println("Twist " + twists + " times!");
  }
}

public class crazyUncle implements Dance {
  public void boogie(int shimmy) {
    System.out.println("I really don't know how to dance.");
  }

  public void yap() {
    System.out.println("When I was your age...!");
  }
}

然后使用它,

public static void main(String[] args) {

  Dance[] dances = new Dance[] {
      new theHustle(), new theMoonwalk(), new theJitterBug(), new crazyUncle()
  };
  for (Dance d : dances) { //for each element in this array of type Dance...
    // Note: The caller just boogies. The object determines the "move".
    d.boogie(3);
  }
}

现在,这是我的解释,解释为什么我应该费心实现一个接口(interface),如果我无论如何都必须重写所有接口(interface)方法:

因为theHuSTLe、theMoonwalk、theJitterbug 和crazyUncle 类都实现了Dance 接口(interface),所以它们实际上“签署”了一份“契约(Contract)”,保证这些类的实例至少包含Dance 接口(interface)中的方法。 因此,即使 theMoonwalk 类与crazyUncle 类不同,theMoonwalk 对象和crazyUncle 对象也可以包含在Dance 类型的数组中,因为这些对象包含Dance 接口(interface)的“DNA”。

此外,我可以在不同的类中使用另一个方法,该方法接受 Dance 类型的参数:

public void danceExercise(Dance d, int num) {        
    d.boogie(num); 

}

当调用 danceExercise 方法时,对于 Dance d 参数,我可以提供实现 Dance 接口(interface)的类型的任何值。因此,由于crazyUncle 和theMoonwalk 都实现了Dance,我可以提供一个crazyUncle 的实例或一个需要舞蹈的theMoonwalk 实例。

TL;DR 谢谢大家!我现在对界面有了更清晰的理解。

最佳答案

你的问题实际上是encapsulates这是界面为何有用的完美示例 - 但让我们“点击”到要点,

public void theJitterbug(int twists) {
    System.out.println("Twist " + twists + " times!");
}
public void theHustle(int steps) {
    System.out.println("Step " + steps + " times!");
}
public void theMoonwalk(int slides) {
    System.out.println("Slide " + slides + " times!");
}

都是舞蹈!所以,让我们这样称呼他们......

public interface Dance {
  public void getDown(int count);
}

现在,你可以 -

public class TheMoonwalk implements Dance {
  public void getDown(int count) {
    System.out.println("Slide " + count + " times!");
  }
}
public class TheHustle implements Dance {
  public void getDown(int steps) {
    System.out.println("Step " + steps + " times!");
  }
}
public class TheJitterBug implements Dance {
  public void getDown(int twists) {
    System.out.println("Twist " + twists + " times!");
  }
}

然后使用它,

public static void main(String[] args) {
  Dance[] dances = new Dance[] {
      new TheHustle(), new TheMoonwalk(), new TheJitterBug()
  };
  for (Dance d : dances) {
    // Note: The caller just gets down. The object determines the "move".
    d.getDown(3);
  }
}

关于Java:难以理解接口(interface)的用途?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24499744/

相关文章:

java 无法识别第二个类路径

java - UI性能:repeat in JSF2/Mojara

java - 使用运算符创建字符串

c# - 是否可以统一删除重复注册?

C# IDisposable问题

java - Android studio - java版本错误

java - 如何根据 GAE 拉取队列中的标签名称了解剩余任务数

java - 没有实现类的接口(interface)实例

java - 多态性和接口(interface) - 澄清?

dart - Dart:使用Interface会产生错误: “isn' t的有效替代