前言
本篇我们介绍接口、接口的多态性以及接口的作用,然后浅浅提一下接口和抽象类的异同,最后我们介绍面向接口编程的思维。
接口
从程序设计的角度来说,接口是相关项目的不同软件开发组开发的软件之间相互交互的协议。比如在图形软件开发中,图像处理公司为图形软件开发公司提供数字图像处理方法,为协调两个公司之间的软件开发需要制定图像处理的接口协议。在图形软件开发项目中,制定好图像处理的接口后,图像处理公司和图形软件开发公司可以独立的并行开发各自的软件项目。图像处理公司可以方便的升级图像处理包,图形软件开发公司可以使用不同的图像处理公司提供的图像处理包。
-
普通类:只有具体实现
-
抽象类:具体实现和规范(抽象方法)都有!
-
接口:只有规范,自己不能写方法。约束和实现分离。
说白了,接口就是规范,也就是定义了一组规则,体现了现实世界中“如果你是…,则必须能…”的思想。接口的本质是契约,就像我们人间的法律一样,制定好后大家都遵守。OO的精髓,是对对象的抽象,最能体现这一点的就是接口。 为什么我们讨论设计,模式都只针对具备了抽象能力的语言(比如C++,Java,C#等),就是因为设计模式所研究的,实际上就是如何合理的去抽象。
声明类的关键字是class,声明接口的关键字是interface
接口的多态性
不同的类实现了相同的接口,不同类实现的接口的行为是不同的。程序设计中接口的多态性的实现是通过接口变量来实现的。把实现接口的类的对象赋值给接口变量,接口变量成为了一个上转型对象,然后使用接口变量调用接口方法。接口指向不同类的对象时,其行为表现是不同的,这就是接口的多态性。
下面我们看一个例子:
public class Example04 {
public static void main(String[] args) {
//创建Speaker类的实例speaker
Speaker speaker = new Speaker();
//speaker的方法makeSpeak的参数为接口类型的参数,下面两个分别是不同的对象(他们都实现了接口Speakable),接口指向不同类的对象时,其行为表现是不同的。这就是接口的多态性。
speaker.makeSpeak(new Dog());
speaker.makeSpeak(new Cat());
}
}
class Speaker {
public void makeSpeak(Speakable ispeak) { //接口类型参数
ispeak.speak();
}
}
//Dog实现接口 重写speak方法
class Dog implements Speakable {
@Override
public void speak(){
System.out.println("Wang Wang Wang!");
}
}
//Cat实接口 重写speak方法
class Cat implements Speakable {
@Override
public void speak(){
System.out.println("Miao Miao Miao!");
}
}
抽象类和接口的异同
抽象类和接口都需要有具体的类去实现。在软件世界中,抽象类和接口的使用场合是不同的。
从语法角度来说,
- 抽象类有构造方法,用于子类实例化使用;接口中没有构造方法
- 抽象类中方法可以抽象也可以不抽象;接口的方法jdk1.7只能是抽象的。默认修饰符:public abstract(推荐:默认修饰符请自己永远手动给出)
jdk1.8可以写以default和static开头的具体方法 - 接口中只可以有常量(默认修饰符:public static final),不可以有变量;abstract类中既可以有常量也可以有变量
接口的作用
- 1.本质上也就是一种约束
- 2.定义一些方法,让不同的人实现
- 3.接口里面的方法都是public abstract
- 4.接口里面的常量都是public static final
- 5.接口不能被实例化,接口中是没有构造器的
- 6.可以实现多个接口,即接口可以多继承,通过implements
- 7.实现了接口的类,必须要重写接口里面的方法
面向接口编程
在一个软件项目的开发过程中,可以分成多个部分,然后共同完成。各个软件开发组织之间只需要定义好各个软件组成部分之间的交互接口,就可以并行独立的完成各自的开发任务。例如自动驾驶项目。如下:
public class Example05 {
public static void main(String[] args) {
AutoDriver driver = new AutoDriver();
driver.drive(new BYD());
driver.drive(new GL());
}
}
class AutoDriver {
public void drive(OperateCar icar) {
//……
icar.start();
//…….
}
}
interface OperateCar {
// constant declarations, if any
// method signatures
//int turn(…);
void start();
// more method signatures
}
class BYD implements OperateCar{
// the OperateCar method implementation
public void start() {
System.out.println("start BYD");
}
// other members, as needed
}
class GL implements OperateCar{
// the OperateCar method implementation
public void start() {
System.out.println("start GL");
}
// other members, as needed
}
结语
真正有光的人,压的时间越久,深度越深,绽放的光芒才可以越灿烂。