Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我们要使用接口来定义方法,并在具体的类中实现和定义它的主体?_Java_Inheritance_Interface - Fatal编程技术网

Java 为什么我们要使用接口来定义方法,并在具体的类中实现和定义它的主体?

Java 为什么我们要使用接口来定义方法,并在具体的类中实现和定义它的主体?,java,inheritance,interface,Java,Inheritance,Interface,让我举个例子来说明我的问题。假设我有一个接口I,其中定义了方法abc()。我还有另外两个类,分别是A和B,它们实现了I并重写了abc()方法。 现在我的问题是,为什么我们的用户界面只是定义方法,而不是直接在类中实现,而没有定义和实现接口?比如 interface I{ public void abc(); } class A implements I{ @Override public void abc() { ... } } class B implements I{ @O

让我举个例子来说明我的问题。假设我有一个
接口I
,其中定义了方法
abc()
。我还有另外两个类,分别是
A
B
,它们实现了I并重写了abc()方法。

现在我的问题是,为什么我们的用户界面只是定义方法,而不是直接在类中实现,而没有定义和实现接口?比如

interface I{
    public void abc();
}
class A implements I{
  @Override
  public void abc() { ... }
}
class B implements I{
  @Override
  public void abc() { ... }
}
而不是

class A {
  public void abc() { ... }
}
class B {
  public void abc() { ... }
}


用小例子解释会很有帮助。谢谢。

你可以,如果你愿意的话,但是你不能像对待
A
B
一样。在仍然能够调用
abc()
方法的情况下,获取
A
B
类型的对象并将它们混合在一起是没有共同的方法的。

假设您有一个处理宠物的应用程序。你可以养很多种类的宠物,但它们都有相同的内部形状和功能。因此,当您有一个像getPet()这样的函数时,您可以为狗、猫等返回相同的接口

一旦你有了宠物对象(可能是狗或猫),你就可以执行相同的功能,例如feedPet(),它将根据真实的宠物有不同的实际代码

如果你不坚持使用一个界面,你需要为每个不同的宠物提供不同的功能。想象一下,如果你想添加一只新宠物,你需要更改代码


很抱歉有点做作,但我希望您能理解。

使用接口可以将接口和实现分离开来。假设我们有另一个依赖于
abc
接口的类。将此函数封装在接口
I
中,允许此类使用
abc
的多个实现,而无需知道(取决于)实现
abc
的特定类,从而形成一个耦合更少、更开放的系统


请注意,有些语言(例如Python)使用“duck”类型。对参数调用
o.abc()
的任何函数都可以使用
A
B
调用,而不需要以任何其他方式表示它们的公共接口。静态类型语言需要不同的机制

这里使用接口I的优点是:

我们可以说,任何暴露了
abc()
的对象都可以放在同一类型的bucket I中。因此,任何实现abc()的对象都属于类型I。我们可以充分利用这些额外的信息。这是一种很好的抽象方式:


任何带有发动机和车轮的机器都是车辆

除了前面的答案之外,如果
a
B
都以相同的方式实现方法
abc
,那么您可以始终考虑将
I
作为一个抽象类,而不是一个接口。因此,您可以从其他响应中列出的继承中获得相同的好处,并且只需实现该方法一次

下面是一篇关于使用抽象类和接口的文章,以供进一步参考: