接口这个东西,和抽象类似,也有不一样的地方。
比如说人类有摄入能量的行为,动物也有,但厉害的是高级点的机器在检测到自身能量不足时也会有摄入能量的这样一个行为。同时,人类也可以有自己的子孙类,动物类也有子孙类,机器类也可以有子孙类。那么,针对这种不确定有哪些类会具有的这种方法,我们就可以把它定义为接口。
一、接口基础理论
接口也是一种引用类型数据,用关键字interface声明,如果要让某一个类实现这个方法,那就要在类声明之后加上implements关键字并加上相应的接口。显然,每一个类都可以实现多个接口。
要注意,如果是某一个子类要去实现接口,那么要先写继承再写实现。
接口中只有常量和抽象方法,而且权限都是public,且常量都是static常量,方法都是abstract方法,在接口定义中,除了数据类型外其它关键字可以省略,比如,下面两个接口的定义其实是等价的:
interface AAA{
int a=1;
int aMethod(); //这里其实是个抽象方法,所以没有方法体
}
interface AAA{
public static final int a=1;
public abstract int aMethod();
}
由于接口中的常量是个类常量(即static常量),所以可以通过接口名直接访问类变量。另外,接口也可以通过extends来继承上一个接口,由于内部的变量与方法权限都是public,所以可以同时继承所有的变量与方法。
二、接口回调与多态
接口回调是一个与对象的上转型对象极为相似的一个操作。可以直接用接口声明变量,而将一个实现了该接口的类创建出来的对象的引用赋给这个变量,那么这个变量就可以使用这个对象重写出来的接口内部的抽象方法了。
由于每一个实现该接口的类重写的内容都有可能不同,所以用接口回调使用的方法也会有不同的运行结果,这就叫接口中的多态。
三、面向接口编程
依据接口回调这样一个操作,我们又有了一个重要的编程思路——面向接口编程。和面向抽象编程一样,这种编程方法也存在“开闭原则”。
拿开头提到的摄入能量这一操作来写一下具体的代码:
首先写下一个接口,这个接口有一个摄入能量的方法
interface Operation{
void eat(); //多么简单粗暴的翻译
}
接着写出三个类,一个People类,一个Animal类,一个Machine类,这三个类都实现了这个接口:
class People implements Operation{
void eat(){
System.out.println("好了,我这个人哪,又吃饱了");
}
}
class Animal implements Operation{
void eat(){
System.out.println("好了,我这个畜生啊,又吃饱了");
}
}
class Machine implements Operation{
void eat(){
System.out.println("好了,我这个机器又吃饱了,接着干活喽!");
}
}
然后我们写出一个调用这个接口的类似于api的这样一个类,这个类就叫做面向接口的类。我们把这个类取名Village,想象这个村庄有人有动物有机器。
class Village{
String name; //村庄的名称
void show(Operation op){
op.eat(); //利用接口回调调用特定对象中重写的方法
}
}
接着写主程序类
class Example{
public static void main(String[] args){
Village vill;
vill.name = "地球村";
System.out.println(vill.name+"的人补充能量后说:");
vill.show(new People());
System.out.println(vill.name+"的动物补充能量后说:");
vill.show(new Animal());
System.out.println(vill.name+"的机器补充能量后显示:");
vill.show(new Machine());
}
}
基本框架如下:
面向接口编程的核心是接口回调,掌握了接口回调,再与之前的面向抽象编程相对比,就可以对接口有更加清楚的理解。
四、结语
唐恬的歌词写得真的是太绝了,我愿称她为yyds!告辞!