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;
}
}