黑马程序员技术交流社区

标题: 关于抽象类 [打印本页]

作者: 占琳    时间: 2012-10-30 13:08
标题: 关于抽象类
看了半天视频也没明白抽象类用来干嘛用的 有谁能解释一下么
作者: 种生祥    时间: 2012-10-30 13:19
主要用于提取共性
作者: 张忠豹    时间: 2012-10-30 13:22
这是老毕的解释:
当多个类出现相同功能,但功能主体不同,
这时可以进行向上抽取,只抽取功能定义,而不抽取功能主体
抽象:看不懂
抽象类的特点:
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);
         }
}


作者: 高志鹏    时间: 2012-10-30 13:34
(I)抽象类
(1)在Java中当一个类被abstract关键字修饰时,该类就叫抽象类。

(2)抽象类是从多个具体类中抽象出来的父类,属于高层次的抽象。

(II)抽象类遵循的原则
(1)抽象类必须使用abstract关键字进行修饰。

(2)抽象类不能被实例化(无法使用new关键字创建对象实例)。

(3)抽象类可以包含属性,方法,构造方法,初始化块,内部类,枚举类。

(4)含有抽象方法的类必须定义成抽象类。


作者: 邢晏玮    时间: 2012-10-30 15:15
是用于向上提取类中所共同拥有的方法的,你在把共同的方法全部抽取到抽象类中,然后再子类中继承抽象类后就可以覆写抽象类中的方法了 不同子类继承后可以覆写不同的方法 这就是抽象类的作用!
作者: 王豪    时间: 2012-10-30 16:09
本帖最后由 王豪 于 2012-10-30 16:12 编辑

抽象类是向上提取出来的共性。
抽象方法必须定义在抽象类中,抽象类方法要被使用,就必须由子类复写类中所有的抽象方法后,才能建立子类对象调用。
抽象类也可以不定义抽象方法,这样做只是不让该类建立对象。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2