Java中接口的重要性

Java中接口的重要性,java,interface,Java,Interface,假设我们有两个类,Tiger和airplane。 这两种类型的一个共同点是速度。我知道创建一个超类ClassWithSpeed,然后从中派生出子类Aeroplane和Tiger,是不合逻辑的。 相反,最好创建一个包含方法speed()的接口,然后在AirPlane和Tiger中实现它。我明白了。但是,我们可以在没有接口的情况下做同样的事情。我们可以在飞机中定义方法speed(),在Tiger中定义方法speed()。 唯一的(可能是非常大的)缺陷是我们无法通过接口引用“接触”到Tiger和air

假设我们有两个类,
Tiger
airplane
。 这两种类型的一个共同点是速度。我知道创建一个超类
ClassWithSpeed
,然后从中派生出子类
Aeroplane
Tiger
,是不合逻辑的。 相反,最好创建一个包含方法
speed()
的接口,然后在
AirPlane
Tiger
中实现它。我明白了。但是,我们可以在没有接口的情况下做同样的事情。我们可以在
飞机
中定义方法
speed()
,在
Tiger
中定义方法
speed()
。 唯一的(可能是非常大的)缺陷是我们无法通过接口引用“接触”到
Tiger
airplane
的对象

我是Java和OOP的初学者,如果有人向我解释接口的作用,我将不胜感激。
干杯

定义接口允许您定义不仅适用于Aeroplane和Tiger的方法,而且适用于共享同一接口的其他类

例如,假设您的接口是IObjectWithSpeed。然后,您可以在一个类中定义这样的方法,该类在IObjectWithSpeed对象上操作

  public double calculateSecondsToTravel( IObjectWithSpeed obj, double distance ) {
       return distance / obj.getSpeed();
  }
接口允许我们满足-openforextension,closeformodification。由于定义了实现IObjectWithSpeed的新类,因此不需要修改上述方法的单个实现

它是:

public int howFast(Airplane airplane) {
    return airplane.speed();
}

public int howFast(Tiger tiger) {
    return tiger.speed();
}

public int howFast(Rocket rocket) {
    return rocket.speed();
}

public int howFast(ThingThatHasntBeenInventedYet thingx) {
    // wait... what? HOW IS THIS POSSIBLE?!
    return thingx.speed();
}

...
vs

现在,想象一下,将来必须返回并更改所有这些
函数的速度

接口或否,每个类都必须实现或继承
speed()
方法。接口让您更容易地使用这些不同的类,因为它们都承诺以特定的方式运行。您将调用
speed()
,它们将返回一个
int
,因此您不必为每个可能的类编写单独的方法


当你发现由于相对论物理学的突破而需要以不同的方式处理速度时,你只需要更新调用
speed()
的方法。当你的曾孙女为超智能Monkeyfish编写一个类时,她不必反汇编你的古老二进制代码并进行更改,这样你的代码就可以监视和控制她的变异军队。她只需声明
超智能Monkeyfish实现了Mover

接口(作为一种语言构造)编译器使用它来证明方法调用是有效的,并允许依赖类与实现类交互,同时对实现类了解最少。

我试图用以下示例解释接口的优点-

假设您有另一个类,其中需要使用tiger或AIROPLANE作为参数。所以通过使用接口,您可以使用

someObject.someMethod(ClassWithSpeed)
但若你们不使用界面,你们可以使用

someObject.someMethod(Tiger)
someObject.someMethod(AeroPlane)
现在你该怎么办?您可能的答案是,“我将使用两个重载方法”。

到目前为止还可以,但是

比如说你需要增加更多的选择(比如汽车、自行车、兔子、乌龟……其他100个)。那么,您将如何更改现有代码??你需要改变很多事情

上面的整个例子只有一个目的。也就是说

“我们需要界面来创建更好的、可重用的和正确的面向对象的界面 “设计”

N.B.

  • 如果您确定程序太小,并且永远不需要更改它们,那么我认为在没有接口的情况下实现是可以的

  • 除了描述这些类的功能外,接口的方法可以在不了解实现它的类的情况下使用,即使对于尚未定义的类也是如此


    例如,如果您需要一个类
    Transport
    来计算有效路径,那么可以给它一个类来实现
    ClassWithSpeed
    作为参数,并使用它的方法
    speed()
    来计算它需要的。通过这种方式,您可以将其用于我们的类
    Aeroplane
    ,也可以用于我们稍后定义的任何类,例如
    Boat
    。Java将注意,如果您想使用类作为
    传输
    的参数,它将实现
    ClassWithSpeed
    ,并且任何实现
    ClassWithSpeed
    的类都将实现方法
    speed()
    以便可以使用。

    我想深入了解许多理论细节,但将尝试使用此示例进行解释

    考虑jdbcapi。它是用于处理Java中与数据库相关的选项的API。现在,行业中有这么多数据库。如何编写驱动程序呢?好的,快速而肮脏的方法可能是使用我们自己的类和API编写自己的实现

    但是从程序员的角度考虑。他们会在使用不同的数据库时开始学习数据库驱动程序的API吗?答案是否定的

    那么,问题的解决方案是什么呢?只要有一个定义良好的API,任何人都可以为自己的实现进行扩展

    在JDBCAPI中,有一些接口,它们是Connection、ResultSet、PreparedStatement、Statement等。现在每个数据库供应商都将实现该接口,并为此编写自己的实现。结果如何减少了开发人员的工作量,易于理解

    现在,这个定制实现可能包含哪些内容?很简单。他们做什么,以ResultSet接口为例并实现它,在ResultSet返回的任何方法中,返回实现ResultSet接口的类,如下所示

    ResultSet rs=新的ResultSetTimepl()//这是他们内部正在做的事情

    所以界面就像合同。他们定义了你的职业
    someObject.someMethod(Tiger)
    someObject.someMethod(AeroPlane)
    
    Class Tiger {
      public MovingEntity mover;
    
     public Tiger(){
    
      mover.speed=30;
      mover.directionX=-1;
      mover.move(mover);
    
     }
    
    }
    Class Plane {
      public MovingEntity mover;
    
     public Plane(){
      mover.speed=500;
      mover.directionX=-1;
      mover.move(mover);
    
     }
    
    
    Abstract Class Moverable(){
      private int xPos;
      private int yPos;
      private int directionX;
      private int directionY;
      private int speed;
    
    
    Class MovingEntity extends Moverable {
     public void move(Moverable m){
       if(m instanceof Tiger){
    
          xPos+=directionX*speed;
          yPos+=directionY*speed;
    
       }else if(m instanceof Plane){
          xPos+=directionX*speed;
          yPos+=directionY*speed;
    
       }
     }