在java中接口体现的很重要,大家可能都听过面向接口编程,那么今天讲讲接口以及接口的使用,
首先讲下抽象类,抽象类比普通的类差别在那呢?抽象类中有抽象方法,这就是最大的差距,因为抽象方法只声明方法,但没有具体实现,抽象类不能实例化,因为类实例化就成了对象,那么对象就可以调用方法,而抽象方法只有声明,所以调用无意义,从反面也可以推断抽象类不能实例化,但是抽象类可以有构造函数,因为它要为子类进行初始化,
Person.java
public abstract class Person {
public Person() {
System.out.println("我是父类的构造方法");
}
public abstract void show();
}
Teacher.java 继承了Person
public class Teacher extends Person {
public Teacher() {
super();
System.out.println("我是子类的构造方法");
}
@Override
public void show() {
System.out.println("show--------------");
}
}
Test.java测试类
public class Test {
public static void main(String[] args) {
Teacher t = new Teacher();
t.show();
}
}
打印结果:
我是父类的构造方法
我是子类的构造方法
show--------------
从结果我么也看出来了,现在讲下接口,接口可以看做一个特殊的抽象类,特殊在那呢?,因为接口的方法都是完全的抽象的,变量都是
常量,
接口的作用:
常用来讲接口是定义实现类的外观,就相当于一份契约,根据外部应用需要的功能,约定了实现类应该要实现的功能,
使用接口的好处:
只要接口不变,内部实现的变化就不会影响到外部应用,从而使系统更加灵活,具有更好的扩展性和可维护性!
现在用工厂模式来讲下接口的好处:
Api.java
public interface Api {
void show();
}
ImplA.java
public class ImplA implements Api {
@Override
public void show() {
System.out.println("implA is show");
}
}
ImplB.jav
public class ImplB implements Api {
@Override
public void show() {
System.out.println("implB is show");
}
}
工厂类Factory.java
public class Factory {
public static Api create(int type){
Api api = null;
if(type==1){
api = new ImplA();
}else if(type==2){
api = new ImplB();
}else{
api = null;
}
return api;
}
}
Client.java
public class Client {
public static void main(String[] args) {
Api api = Factory.create(1);
api.show();
}
}
在此中我们可以看出接口起来隔离的作用,把Client看做是客户端,客户端要获取ImplA类的实例,我们是使用工厂的模式去获取该对象,Client并没有直接与ImplA类联系在一起,在中间用Api接口隔离了,因为Client类并没有和具体的实现类发生关系,在这里接口就起到了隔离的作用,从而降低了Client类与ImplA类之间的耦合度,
回调我们知道,在java中回调用的非常之多,比如android中的Button点击事件就是使用接口回调实现的,现在讲讲java中的回调是怎么实现的,先看看接口的定义
打个比方:
有一天小王遇到一个很难的问题,问题是“1 + 1 = ?”,就打电话问小李,小李一下子也不知道,就跟小王说,等我办完手上的事情,就去想想答案,小王也不会傻傻的拿着电话去等小李的答案吧,于是小王就对小李说,我还要去逛街,你知道了答案就打我电话告诉我,于是挂了电话,自己办自己的事情,过了一个小时,小李打了小王的电话,告诉他答案是2,这是网上讲回调经典的比方:
画一个简单的图,演示下回调的流程
上面的图解释的是同步回调,