Java接口有什么真正的意义吗?

mar*_*ark 12 java

可能重复:
Java接口实际上是如何使用的?

我不是从一个学术流行语的观点来谈论,而是从一个实际的开发者的角度来看.

举个例子: -

    Class1 implements Interface 
 public String methodOne() {
  return "This is Class1.methodOne()";
 }

 public String methodTwo() {
  return "This is Class1.methodTwo()";
 }
    }
Class2:

    Class2 implements Interface 
 public String methodOne() {
  return "This is Class2.methodOne()";
 }

 public String methodTwo() {
  return "This is Class2.methodTwo()";
 }
    }
Run Code Online (Sandbox Code Playgroud)

使用界面: -

 Client {
  Interface intface = new Class1();

  intface.methodOne();
  intface.methodTwo();

  Interface intface = new Class2();
  intface.methodOne();
  intface.methodTwo();
}
Run Code Online (Sandbox Code Playgroud)

但是,与写作相比有什么好处: -

 Client {
Class1 clas1 = new Class1();

clas1.methodOne();
clas1.methodTwo();

Class2 clas2 = new Class2();
clas2.methodOne();
clas2.methodTwo();
 }
Run Code Online (Sandbox Code Playgroud)

并完全绕过接口.

为了增加一层代码,接口似乎只是一个额外的代码层,或者除了"以下是您正在访问的类的方法有哪些"之外还有更多的代码?

Pét*_*rök 19

使用独立类时,您不需要接口.但是,当您拥有类型层次结构时,接口确实是必不可少的.

你的简单例子并没有真正公正,但让我们将你的界面重命名为更有用和具体的东西,例如一个Sorter可以获取项目列表并对其进行排序的算法.您可以实现几种不同的排序算法,并且您可能希望根据上下文更改所使用的算法(即QuickSort对于大型数据集更快,但BubbleSort更适合小型数据集等)所以你不需要想要将客户端代码绑定到一个特定的算法.通过使用多态Sorter类型(实现为接口),您可以将不同的具体分类器对象传递给客户端,而无需了解(和关心)它实际使用的算法.您可以随时引入更好的排序算法,或者删除一个被证明效率低下的算法,而不会让客户注意到任何事情.

没有接口,这样的壮举是不可能的.替代方案是直接从(可能是重复的)if-else调用排序方法,或者在整个地方切换块,在添加/删除排序算法时忘记更新所有位置时不可避免地会引入错误. ..更不用说你需要在每次这样的改变后重新编译所有客户端代码:-(


Ita*_*aro 6

假设您想要一个具有"Method1"和"Method2"两种方法的对象集合.并且您不希望以编程方式检查集合中的每个实例的类型.
对象的集合,接口保存您执行此操作的工具.
它称为多态,它非常有用.