我最近接触到了 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/