⛳ java中抽象类
Java中的抽象类是一种特殊的类,它不能被实例化,只能被继承。抽象类用abstract关键字来修饰。
🎨 特点:
- 抽象类不能被实例化:抽象类不能被直接实例化,因为它只是一个模板或者说是一个蓝图,需要子类继承并实现它的抽象方法才能被实例化。
- 抽象类可以包含抽象方法:抽象方法是没有实现的方法,只有方法的声明,没有方法体。抽象类中可以包含抽象方法,子类必须实现这些抽象方法。
- 抽象类可以包含实现方法:抽象类中可以包含实现方法,子类可以直接继承并使用这些实现方法。
- 抽象类可以包含构造方法:抽象类可以包含构造方法,但是不能被实例化,所以构造方法只能被子类调用。
- 抽象类可以被继承:抽象类可以被子类继承,子类必须实现抽象类中的所有抽象方法,否则子类也必须声明为抽象类。
- 抽象类可以实现接口:抽象类可以实现接口,这样子类就可以继承抽象类并实现接口。
总之,抽象类是一种用于封装、继承和多态的重要机制。通过抽象类,我们可以定义一些通用的方法和属性,并在子类中进行具体实现。
🐾 例子:
以下是一个抽象类的例子:
public abstract class Animal {protected String name;protected int age;public Animal(String name, int age) {this.name = name;this.age = age;}public abstract void makeSound();
}
在这个例子中,Animal类是一个抽象类,它有一个抽象方法makeSound(),这个方法必须在子类中被实现。Animal类还有两个实例变量name和age,以及一个构造方法。由于Animal类是抽象的,所以不能被实例化,只能被继承。
以下是一个数据库连接基础类:
public abstract class BaseDAO<T> {public final String DRIVER = "com.mysql.jdbc.Driver" ;public final String URL = "jdbc:mysql://localhost:3306/fruitdb?useUnicode=true&characterEncoding=utf-8&useSSL=false";public final String USER = "root";public final String PWD = "123456" ;protected Connection conn ;protected PreparedStatement psmt ;protected ResultSet rs ;//T的Class对象private Class entityClass ;public BaseDAO(){//getClass() 获取Class对象,当前我们执行的是new FruitDAOImpl() , 创建的是FruitDAOImpl的实例//那么子类构造方法内部首先会调用父类(BaseDAO)的无参构造方法//因此此处的getClass()会被执行,但是getClass获取的是FruitDAOImpl的Class//所以getGenericSuperclass()获取到的是BaseDAO的ClassType genericType = getClass().getGenericSuperclass();//ParameterizedType 参数化类型Type[] actualTypeArguments = ((ParameterizedType) genericType).getActualTypeArguments();//获取到的<T>中的T的真实的类型Type actualType = actualTypeArguments[0];try {entityClass = Class.forName(actualType.getTypeName());} catch (ClassNotFoundException e) {e.printStackTrace();}}protected Connection getConn(){try {//1.加载驱动Class.forName(DRIVER);//2.通过驱动管理器获取连接对象return DriverManager.getConnection(URL, USER, PWD);} catch (ClassNotFoundException | SQLException e) {e.printStackTrace();}return null ;}protected void close(ResultSet rs , PreparedStatement psmt , Connection conn){try {if (rs != null) {rs.close();}if(psmt!=null){psmt.close();}if(conn!=null && !conn.isClosed()){conn.close();}} catch (SQLException e) {e.printStackTrace();}}//给预处理命令对象设置参数private void setParams(PreparedStatement psmt , Object... params) throws SQLException {if(params!=null && params.length>0){for (int i = 0; i < params.length; i++) {psmt.setObject(i+1,params[i]);}}}//执行更新,返回影响行数protected int executeUpdate(String sql , Object... params){boolean insertFlag = false ;insertFlag = sql.trim().toUpperCase().startsWith("INSERT");try {conn = getConn();if(insertFlag){psmt = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);}else {psmt = conn.prepareStatement(sql);}setParams(psmt,params);int count = psmt.executeUpdate() ;if(insertFlag){rs = psmt.getGeneratedKeys();if(rs.next()){return ((Long)rs.getLong(1)).intValue();}}return count ;} catch (SQLException e) {e.printStackTrace();}finally {close(rs,psmt,conn);}return 0;}//通过反射技术给obj对象的property属性赋propertyValue值private void setValue(Object obj , String property , Object propertyValue){Class clazz = obj.getClass();try {//获取property这个字符串对应的属性名 , 比如 "fid" 去找 obj对象中的 fid 属性Field field = clazz.getDeclaredField(property);if(field!=null){field.setAccessible(true);field.set(obj,propertyValue);}} catch (NoSuchFieldException | IllegalAccessException e) {e.printStackTrace();}}//执行复杂查询,返回例如统计结果protected Object[] executeComplexQuery(String sql , Object... params){try {conn = getConn() ;psmt = conn.prepareStatement(sql);setParams(psmt,params);rs = psmt.executeQuery();//通过rs可以获取结果集的元数据//元数据:描述结果集数据的数据 , 简单讲,就是这个结果集有哪些列,什么类型等等ResultSetMetaData rsmd = rs.getMetaData();//获取结果集的列数int columnCount = rsmd.getColumnCount();Object[] columnValueArr = new Object[columnCount];//6.解析rsif(rs.next()){for(int i = 0 ; i<columnCount;i++){Object columnValue = rs.getObject(i+1); //33 苹果 5columnValueArr[i]=columnValue;}return columnValueArr ;}} catch (SQLException e) {e.printStackTrace();} finally {close(rs,psmt,conn);}return null ;}//执行查询,返回单个实体对象protected T load(String sql , Object... params){try {conn = getConn() ;psmt = conn.prepareStatement(sql);setParams(psmt,params);rs = psmt.executeQuery();//通过rs可以获取结果集的元数据//元数据:描述结果集数据的数据 , 简单讲,就是这个结果集有哪些列,什么类型等等ResultSetMetaData rsmd = rs.getMetaData();//获取结果集的列数int columnCount = rsmd.getColumnCount();//6.解析rsif(rs.next()){T entity = (T)entityClass.newInstance();for(int i = 0 ; i<columnCount;i++){String columnName = rsmd.getColumnName(i+1); //fid fname priceObject columnValue = rs.getObject(i+1); //33 苹果 5setValue(entity,columnName,columnValue);}return entity ;}} catch (SQLException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} finally {close(rs,psmt,conn);}return null ;}//执行查询,返回Listprotected List<T> executeQuery(String sql , Object... params){List<T> list = new ArrayList<>();try {conn = getConn() ;psmt = conn.prepareStatement(sql);setParams(psmt,params);rs = psmt.executeQuery();//通过rs可以获取结果集的元数据//元数据:描述结果集数据的数据 , 简单讲,就是这个结果集有哪些列,什么类型等等ResultSetMetaData rsmd = rs.getMetaData();//获取结果集的列数int columnCount = rsmd.getColumnCount();//6.解析rswhile(rs.next()){T entity = (T)entityClass.newInstance();for(int i = 0 ; i<columnCount;i++){String columnName = rsmd.getColumnName(i+1); //fid fname priceObject columnValue = rs.getObject(i+1); //33 苹果 5setValue(entity,columnName,columnValue);}list.add(entity);}} catch (SQLException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} finally {close(rs,psmt,conn);}return list ;}
}