接口的定义,意味实现类具有那些行为
比如java 的数据结构,举个例子如Queue(队列),jdk源码就是接口
show源码
public interface Queue<T> {
/**
* 增加一个元索
*/
public void add();
/**
* 移除并返回队列头部的元素
* @return
*/
public T remove();
/**
* 返回队列头部的元素
* @return
*/
public T element();
/**
* 添加一个元素并返回true
* @return
*/
public boolean offer();
.....
}
可以看出Queue中定义了很多方法,需要子类去实现,子类实现后,这些方法都要实现,同时为子类定义具有那些行为,如队列必须具有添加元素,删除元素行为等等
接口的出现,同时也是为了解耦,如面向接口编程,降低程序耦合度。
面向接口其实在android中体现的很抽象,而对于依赖注入更是在近一年才兴起的,so,为了更好的理解,我举一个很java的例子~
如数据库存储,你跟纠结是应该用哪个数据库框架,但是领导也不确定,这个时候体现你的水平的时候了,想想怎么写能够在后面更换框架的时候,修改代码量最好。
我来给你一个思路:
1.接口走起
public interface IDAO{
void save(User user) throws UserNameExistException;
}
2.jdbc实现
public class JDBCDAO implements IDAO{
public void save(User user) throws UserNameExistException{
.....
String sql = "insert into t_user values(?,?,?,?)";
....
PreparedStatement pstm = conn.prepareStatement(sql);
pstm.setString(1,user.getName());
....
pstm.executeUpdate();
......
}
}
3.Hibernate的实现是
public class HibernateDAO implements IDAO{
public void save(User user) throws UserNameExistException{
......
session.save(user);
session.getTransaction().commit();
....
}
}
4.使用
public void register(String userName,String password,int age,....等等参数){
//假设现在用的是JDBC的实现
IDAO dao = new JDBCDAO();//当你需要替换实现的时候,只要把这个JDBCDAO换成HibernateDAO就可以了,其它代码不需要改。
User user = new User();
user.setName(userName);
......
dao.save(user);
}
看到了么,如果换了框架,代码的改动并没有改动多少~
接口和抽象类区别
- 抽象-单继承->多继承->接口
- 需要有具体实现方法,声明变量,构造函数,同时也能不必全部实现你可以选择抽象类,接口所有方法都是抽象的,必须全部实现,同时可以创建静态产量
- 接口都是public,而抽象类确没有这个限制