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
作为一个抽象类,而不是一个接口。因此,您可以从其他响应中列出的继承中获得相同的好处,并且只需实现该方法一次
下面是一篇关于使用抽象类和接口的文章,以供进一步参考: