面向对象的精髓,最能体现这一点的就是接口!
为什么我们讨论设计模式都只针对具备了抽象能力的语言(比如C++、Java、C#等),就是因为设计模式所研究的,实际上就是如何合理的去抽象。
接口就是一组规范,所有实现的类都要遵守。它是比“抽象类”还“抽象”的“抽象类”,可以更加规范的对子类进行约束。全面地专业地实现了:规范和具体实现的分离。
在接口这个特殊类里,不再像上一节讲的普通的抽象类一样,还可以在抽象类里另外定义普通属性或者普通方法,在接口里不再允许如此,只允许有抽象方法。
接口是两个模块之间通信的标准,通信的规范。如果能把你要设计的模块之间的接口定义好,就相当于完成了系统的设计大纲,剩下的就是添砖加瓦的具体实现了。大家在工作以后,做系统时往往就是使用“面向接口”的思想来设计系统。
接口和实现类不是父子关系,是实现规则的关系。比如:我定义一个接口Runnable,Car实现它就能在地上跑,Train实现它也能在地上跑,飞机实现它也能在地上跑。就是说,如果它是交通工具,就一定能跑,但是一定要实现Runnable
接口。
示例代码:
package testInterface;
public interface Volant {
/*public abstract final*/ int Fly_Hight =100;//默认有public abstract final,写不写都一样
/*public abstract */ void fly() ; //默认有public abstract 写不写都一样
}
interface Honest {
void helpOther();
}
class GoodMan implements Honest{ //GoodMan类实现接口Honest
@Override
public void helpOther() {//类必须实现接品里的方法,也就是重写接口里的抽象方法,增加{}
System.out.println("扶老人过马路!");
}
}
class BirdMan implements Volant{
@Override
public void fly() {
System.out.println("我在飞");
}
}
class Angel implements Volant,Honest {//类同时实现两个接口的示例
@Override
public void fly() {
System.out.println("Angel.fly");
}
@Override
public void helpOther() {
System.out.println("Angel.helpOther");
}
}
class Plane implements Volant{ //用这个类是为了更好说明,接口可以更好的抽象出飞这个特征并方便地给所有类使用
//如果不用接口而用继承,就不能这样轻易做到。
@Override
public void fly() {
System.out.println("飞机,在飞");
}
}
package testInterface;
public class Test {
public static void main(String[] args) {
Angel a = new Angel(); // a可以使用Angel实现的两个接口里的方法以及常量
a.fly();
a.helpOther();
System.out.println(Volant.Fly_Hight);
Volant a2 = new Angel();//这里与前面讲的多态一样的道理
a2.fly();//a2仍属于Volant类型,只能使用它的fly方法
a2.helpOther();//不能使用属于Angelr的helpOther方法,如一定要使用需强制转型
Volant a3 = new Volant();//接口本身不能创建实例
}
}