1 接口的意义
(1)重要性:在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。
(2)简单、规范性:如果一个项目比较庞大,那么就需要一个能理清所有业务的架构师来定义一些主要的接口,这些接口不仅告诉开发人员你需要实现那些业务,而且也将命名规范限制住了(防止一些开发人员随便命名导致别的程序员无法看明白)。
(3)维护、拓展性:比如你要做一个开车程序,其中有一个开车业务类,主要负责开车功能。不久,你突然发现这个类满足不了你了,然后你又要重新设计这个类,更糟糕是你可能要放弃这个类,那么其他地方可能有引用他,这样修改起来很麻烦。
如果在开始定义一个接口,把开车功能放在接口里,然后定义类去实现这个接口,然后你只要用这个接口去引用实现它的类就行了,以后要换的话只不过是引用另一个类而已,这样就达到维护、拓展的方便性。
(4)安全、严密性:接口是实现软件松耦合的重要手段,它描叙了系统对外的所有服务,而不涉及任何具体的实现细节。这样就比较安全、严密一些(一般软件服务商考虑的比较多)。
2 例子演示
2.1 不使用接口的例子
(1)首先,定义了单车、汽车和开车业务类。
//单车
public class Bike {
@Override
public void start() {
System.out.println("单车启动...");
}
@Override
public void park() {
System.out.println("单车停车...");
}
}
//汽车
public class Car {
@Override
public void start() {
System.out.println("汽车启动...");
}
@Override
public void park() {
System.out.println("汽车停车...");
}
}
//开车业务类
public class DriveTask {
public void doSomething(Bike bike){
bike.start();
}
public void doSomething(Car car){
car.start();
}
}
(2)然后,在添加火车类时,随意定义了火车启动的方法,而且得继续往DriveTask添加方法。
//火车
public class Train {
@Override
public void startTrain() {
System.out.println("火车启动...");
}
@Override
public void parkTrain() {
System.out.println("火车停车...");
}
}
(3)小结:车的公共方法:启动、停车,没有规范性;添加开车业务时,没有扩展性可言。
2.2 使用接口
(1)定义开车接口,定下规范
public interface Drive {
void start();
void park();
}
(2)定义了单车、汽车和火车类。
//单车
public class Bike implements Drive {
@Override
public void start() {
System.out.println("单车启动...");
}
@Override
public void park() {
System.out.println("单车停车...");
}
}
//汽车
public class Car implements Drive {
@Override
public void start() {
System.out.println("汽车启动...");
}
@Override
public void park() {
System.out.println("汽车停车...");
}
}
//火车
public class Train implements Drive {
@Override
public void start() {
System.out.println("火车启动...");
}
@Override
public void park() {
System.out.println("火车停车...");
}
}
(3)定义开车业务类,只需要添加车类,不需要修改开车业务类可以实现基本的功能,体现扩展性。
//开车业务类
public class DriveTask {
public void doSomething(Drive drive){
drive.start();
}
}
(4)开车客户端
public class Test {
public static void main(String[] args) {
DriveTask driveTask = new DriveTask();
driveTask.doSomething(new Car());
driveTask.doSomething(new Train());
}
}
3 抽象类的意义
抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。具体分析如下:
(1)因为抽象类不能实例化对象,所以必须要有子类来实现它之后才能使用。这样就可以把一些具有相同属性和方法的组件进行抽象,这样更有利于代码和程序的维护。
(2)当又有一个具有相似的组件产生时,只需要实现该抽象类就可以获得该抽象类的那些属性和方法。
4 接口与抽象类区别
抽象类具有接口的意义:简单、规范性;维护、拓展性。接口对比抽象类可以实现多继承。
public class Bike extends Car implements Drive {
@Override
public void start() {
System.out.println("单车启动...");
}
@Override
public void park() {
System.out.println("单车停车...");
}
}