为什么要声明一个接口,然后在Java中用它实例化一个对象?

2022-09-01 18:58:27

我和一个朋友正在学习Java。我们今天正在研究接口,我们讨论了如何使用接口。

我的朋友向我展示的示例代码包含以下内容:

IVehicle modeOfTransport1 = new Car();
IVehicle modeOfTransport2 = new Bike();

其中 IVehicle 是在汽车和自行车类中实现的接口。定义接受 IVehicle 作为参数的方法时,可以使用接口方法,并且当您运行代码时,上述对象将正常工作。但是,在声明汽车和自行车时,这完全可以正常工作,就像您通常希望的那样:

Car modeOfTransport1 = new Car();
Bike modeOfTransport2 = new Bike();

所以,我的问题是 - 为什么在声明和实例化 modeOfTransport 对象时,你会使用前者而不是后者?这重要吗?


答案 1

使用接口声明它们有一个很大的优点,这就是所谓的“编码到接口”而不是“编码到实现”,这是一个很大的面向对象设计(OOD原则,这样你就可以声明这样一个方法:

public void (IVehicle myVehicle)

这将接受实现该接口的任何对象,然后在运行时它将调用实现,如下所示:

public void (IVehicle myVehicle)
{
    myVehicle.run() //This calls the implementation for that particular vehicle.
}

要回答最初的问题,为什么你会使用一个而不是另一个,有几个原因:

1)使用接口声明它们,意味着您以后可以用实现该接口的任何其他具体类替换该值,而不是被锁定在该特定的具体类中

2) 您可以通过使用接口声明多态性来充分利用它们,因为每个实现都可以在运行时调用正确的方法。

3)您遵循OOD代码原理到接口


答案 2

这在那里并不重要。

真正重要的地方是在需要在IVehicle上运行的其他接口中。如果他们接受参数并返回值作为IVehicle,那么代码将更容易扩展。

如前所述,这些对象中的任何一个都可以传递给接受 IVehicle 作为参数的方法。

如果您有后续代码使用了使用的 Car 或 Bike 特定操作,则将它们声明为 Car 或 Bike 将是有利的。汽车和自行车特定的操作将可用于每个相关对象,并且两者都可用作(即可以传递)作为IVehicle。