| 这是老毕的解释: 当多个类出现相同功能,但功能主体不同,
 这时可以进行向上抽取,只抽取功能定义,而不抽取功能主体
 抽象:看不懂
 抽象类的特点:
 1、        抽象方法一定在抽象类中。
 2、        抽象方法和抽象类都必须用abstract修饰符修饰
 3、        抽象类不可以用new创建对象,因为调用抽象方法没有意义
 4、        抽象类中的抽象方法要被调用,必须由子类重写所有的抽象方法后,建立子类对象调用。如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类
 抽象方法可以写成非抽象的,抽象方法不一定是必须的。(因为子类在继承父类的时候,可以重写父类中的相关方法)。在抽象类中抽象方法不一定是必须的:抽象类中不一定有抽象方法,抽象方法一定是放在抽象类中的。
 
 个人见解:抽象类一般是用来当模版使用的。在李勇的jdbc里面对于使用抽象类恰到好处。
 相关代码:
 
 public abstract class AbstractDao {          public Object find(String sql, Object[] args) {                    Connection conn = null;                    PreparedStatement ps = null;                    ResultSet rs = null;                    try {                             conn = JdbcUtils.getConnection();                             ps = conn.prepareStatement(sql);                             for (int i = 0; i < args.length; i++)                                      ps.setObject(i + 1, args);                             rs = ps.executeQuery();                             Object obj = null;                             if (rs.next()) {                                      obj = rowMapper(rs);                             }                             return obj;                    } catch (SQLException e) {                             throw new DaoException(e.getMessage(), e);                    } finally {                             JdbcUtils.free(rs, ps, conn);                    }          }          //将功能不同的地方抽象出来,由子类实现          abstract protected Object rowMapper(ResultSet rs) throws SQLException;          public int update(String sql, Object[] args) {                    Connection conn = null;                    PreparedStatement ps = null;                    ResultSet rs = null;                    try {                             conn = JdbcUtils.getConnection();                             ps = conn.prepareStatement(sql);                             for (int i = 0; i < args.length; i++)                                      ps.setObject(i + 1, args);                             return ps.executeUpdate();                    } catch (SQLException e) {                             throw new DaoException(e.getMessage(), e);                    } finally {                             JdbcUtils.free(rs, ps, conn);                    }          } }
 
 调用抽取方法的模版UserDaoImpl.java package day3.cn.itcast.jdbc.dao.refactor; import java.sql.ResultSet; import java.sql.SQLException; import day3.cn.itcast.jdbc.domain.User; public class UserDaoImpl extends AbstractDao {          public User findUser(String loginName, String password) {                    String sql = "select id, name, money, birthday  from user where name=?";                    Object[] args = new Object[] { loginName };                    Object user = super.find(sql, args);                    return (User) user;          }          public String findUserName(int id) {                    String sql = "select  name from user where id=?";                    Object[] args = new Object[] { id };                    Object user = super.find(sql, args);                    return ((User) user).getName();          }            protected Object rowMapper1(ResultSet rs) throws SQLException {                    return rs.getString("name");          } //不同的AbstractDao实现类,实现rowMapper的方式不同          protected Object rowMapper(ResultSet rs) throws SQLException {                    User user = new User();                    user.setId(rs.getInt("id"));                    user.setName(rs.getString("name"));                    user.setMoney(rs.getFloat("money"));                    user.setBirthday(rs.getDate("birthday"));                    return user;          }            public void delete(User user) {                    String sql = "delete from user where id=?";                    Object[] args = new Object[] { user.getId() };                    super.update(sql, args);          }            public void update(User user) {                    String sql = "update user set name=?, birthday=?, money=? where id=? ";                    Object[] args = new Object[] { user.getName(), user.getBirthday(),                                      user.getMoney(), user.getId() };                    super.update(sql, args);          } }   
 |