接口和抽象类看起来非常相似,但是它们之间有重要的区别。
抽象基于良好的“ is-a ”关系。这意味着您会说汽车是本田,而本田是汽车。在类上使用抽象意味着您也可以拥有抽象方法。这将需要从它扩展的任何子类来获取抽象方法并覆盖它们。使用下面的示例,我们可以创建一个抽象的 howToStart(); 需要每个类来实现它的方法。
通过抽象,我们可以提供代码之间的相似性,因此我们仍然有一个基类。使用 Car 类想法的示例,我们可以创建:
public abstract class Car{
private String make;
private String model
protected Car() { } // Default constructor
protect Car(String make, String model){
//Assign values to
}
public abstract void howToStart();
}
然后有了本田课程,我们将拥有:
public class Honda extends implements Engine {
public Honda() { } // Default constructor
public Honda(String make, String model){
//Assign values
}
@Override
public static void howToStart(){
// Code on how to start
}
}
接口基于“has-a”关系。这意味着你可以说汽车有引擎,但引擎不是汽车。在上面的例子中,本田有implements Engine
.
对于引擎接口,我们可以创建:
public interface Engine {
public void startup();
}
该接口将提供一个多对一的实例。所以我们可以将 Engine 接口应用于任何类型的汽车。我们还可以将其扩展到其他对象。就像我们要创建一个小船类,并且有小船类型的子类,我们可以扩展引擎并让小船的子类需要该startup();
方法。接口有利于为具有某些相似性的各种类创建框架。我们还可以在一个类中实现多个实例,例如:
public class Honda extends implements Engine, Transmission, List<Parts>
希望这会有所帮助。