黑马程序员技术交流社区
标题: 关于抽象类 [打印本页]
作者: 占琳 时间: 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 |