//定义一个接口,表示与数据库交互的规范
public interface UserDao{
public User queryByUserName(String username);
public int saveUser(User user);
}
//用一个类来实现
public class userDaoImpl implements userDao{
@Override
public User queryByUserName(String username){
return null; //这里面写自己具体的实现方法
};
@Override
public int saveUser(User user){
return -1;
};
}
在对userDaoImpl进行实例化时:
UserDao userDao = new UserDaoImpl();
而不是:
UserDaoImpl userDaoImpl = new UserDaoImpl();
在网上查阅资料,很多人都解释了使用接口类型来引用对象的情况,即在什么情况下使用接口类型,在什么情况下使用类类型,但是为什么要这样做,很多都是说到这样做会更灵活,方便后期维护,对于没有开发经验的人其实很难体会到这里“灵活”指的是什么,在这里使用一个栗子来稍微形象的解释一下(个人理解):
现在有一段代码:
//使用接口类型来引用对象
void queryUserByName() {
UserDao userDao = new UserDaoImpl1();
String name = userDao.queryUserByName("admin");
System.out.println(name);
}
//使用类类型来引用对象
void queryUserByName() {
UserDaoImpl1 userDaoImpl1 = new UserDaoImpl1();
String name = userDaoImpl1.queryUserByName("admin");
System.out.println(name);
}
现在UserDaoImpl1中的方法被废弃了,或者说这个类我觉得写的太烂了,但我又懒得改我想写一个新的类UserDaoImpl2,这个时候只需要在上面的代码块1中将new UserDaoImpl1()更改为 new UserDaoImpl2()即可,至于前面的接收类型一直是UserDao,那么后面不管是什么类,只要它实现了UserDao定义的规范就可以。而如果使用第二个代码块,意味着你要么只能去更改原来的类UserDaoImpl1,要么重新写一个实现类UserDaoImpl2,相应的引用部分变成:
UserDaoImpl2 userDaoImpl2 = new UserDaoImpl2();
这样虽然也能实现,但是于Java多态的思想相违背。Java这样设计的初衷是让接收对象减少对某个类的依赖,在本例中就是减少userDao的实例对于UserDaoImpl1类的依赖。