继承
考虑一下汽车和公共汽车。他们是两种不同的车辆。但是,它们仍然具有一些共同的特性,例如具有转向器,制动器,齿轮,发动机等。
因此,通过继承概念,可以将其表示为...
public class Vehicle {
private Driver driver;
private Seat[] seatArray; //In java and most of the Object Oriented Programming(OOP) languages, square brackets are used to denote arrays(Collections).
//You can define as many properties as you want here ...
}
现在是自行车...
public class Bicycle extends Vehicle {
//You define properties which are unique to bicycles here ...
private Pedal pedal;
}
还有一辆车...
public class Car extends Vehicle {
private Engine engine;
private Door[] doors;
}
这就是继承。如上所述,我们使用它们将对象分类为更简单的基本形式及其子对象。
抽象类
抽象类是不完整的对象。为了进一步理解它,让我们再次考虑车辆的类比。
可以驾驶车辆。对?但是,不同的车辆以不同的方式行驶。例如,您不能像驾驶自行车一样驾驶汽车。
那么如何代表车辆的驱动功能呢?很难检查它是什么类型的车辆并以其自身的功能驾驶它;您必须在添加新型车辆时一次又一次地更改Driver类。
这里是抽象类和方法的作用。您可以将drive方法定义为抽象,以告诉每个继承的子代必须实现此功能。
因此,如果您修改车辆类别...
//......Code of Vehicle Class
abstract public void drive();
//.....Code continues
自行车和汽车还必须指定如何驾驶。否则,代码将无法编译,并引发错误。
简而言之,抽象类是具有某些不完整功能的部分不完整类,继承子级必须指定它们自己的功能。
接口
接口是完全不完整的。它们没有任何属性。它们只是表明继承的孩子有能力做某事。...
假设您随身携带不同类型的手机。它们每个都有不同的方式来执行不同的功能。例如:打电话给一个人。手机的制造商会指定如何进行。手机可以在此处拨打号码-即可以拨打。让我们将其表示为接口。
public interface Dialable {
public void dial(Number n);
}
在这里,“可拨号”的制造商定义了如何拨打号码。您只需要给它拨一个号码即可。
// Makers define how exactly dialable work inside.
Dialable PHONE1 = new Dialable() {
public void dial(Number n) {
//Do the phone1's own way to dial a number
}
}
Dialable PHONE2 = new Dialable() {
public void dial(Number n) {
//Do the phone2's own way to dial a number
}
}
//Suppose there is a function written by someone else, which expects a Dialable
......
public static void main(String[] args) {
Dialable myDialable = SomeLibrary.PHONE1;
SomeOtherLibrary.doSomethingUsingADialable(myDialable);
}
.....
因此,使用接口而不是抽象类,使用Dialable的函数的编写者无需担心其属性。例如:它有触摸屏或拨号盘吗?是固定座机还是移动电话。您只需要知道它是否可拨号即可。它是否继承(或实现)了Dialable接口。
更重要的是,如果有一天您将Dialable切换为其他
......
public static void main(String[] args) {
Dialable myDialable = SomeLibrary.PHONE2; // <-- changed from PHONE1 to PHONE2
SomeOtherLibrary.doSomethingUsingADialable(myDialable);
}
.....
您可以确保代码仍然可以正常工作,因为使用可拨号功能的功能不(也不能)依赖于“可拨号”界面中指定的详细信息。它们都实现了Dialable接口,而这只是该函数所关心的。
开发人员通常使用接口来确保对象之间的互操作性(可互换使用),只要它们具有相同的功能(就像您可能需要更改为座机或移动电话一样,只要您只需拨一个号码即可)。简而言之,接口是抽象类的简单得多的版本,没有任何属性。
另外,请注意,您可以实现(继承)任意数量的接口,但只能扩展(继承)单个父类。
更多信息
抽象类与接口