⛳ java中抽象类

news/2024/11/22 22:22:38/

⛳ java中抽象类

Java中的抽象类是一种特殊的类,它不能被实例化,只能被继承。抽象类用abstract关键字来修饰。

🎨 特点:

  1. 抽象类不能被实例化:抽象类不能被直接实例化,因为它只是一个模板或者说是一个蓝图,需要子类继承并实现它的抽象方法才能被实例化。
  2. 抽象类可以包含抽象方法:抽象方法是没有实现的方法,只有方法的声明,没有方法体。抽象类中可以包含抽象方法,子类必须实现这些抽象方法。
  3. 抽象类可以包含实现方法:抽象类中可以包含实现方法,子类可以直接继承并使用这些实现方法。
  4. 抽象类可以包含构造方法:抽象类可以包含构造方法,但是不能被实例化,所以构造方法只能被子类调用。
  5. 抽象类可以被继承:抽象类可以被子类继承,子类必须实现抽象类中的所有抽象方法,否则子类也必须声明为抽象类。
  6. 抽象类可以实现接口:抽象类可以实现接口,这样子类就可以继承抽象类并实现接口。

总之,抽象类是一种用于封装、继承和多态的重要机制。通过抽象类,我们可以定义一些通用的方法和属性,并在子类中进行具体实现。

🐾 例子:

以下是一个抽象类的例子:

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 ;}
}

http://www.ppmy.cn/news/252529.html

相关文章

什么软件可以测试麦克风音质,怎么测试麦克风

怎么测试麦克风 内容精选 换一换 址:《大史住在大前端》原创博文目录华为云社区地址:【你要的前端打怪升级指南】JavaScript基础修炼(14)——WebRTC在浏览器中如何获得指定格式的PCM数据一. PCM格式是什么二. 浏览器中的音频采集处理三. 需求实现方案1——服务端FFmpeg实现编…

android 麦克风 动画,录音麦克风动画效果

我们常用的语音输入法会根据我们说话的大小产生一些波动动画,那么这个动画是怎么实现的呢?其实很简单。原理:一张空的麦克风图像,一张满的麦克风图像,先绘制一张空的,然后再绘制一些满的,但是满的绘制之前,有一个圆形的clip区域,这个区域就是用来显示满的显示多少。另…

计算机麦克风测试,如何进行电脑话筒测试?电脑麦克风如何设置?

如何进行电脑话筒测试?电脑麦克风如何设置? 2015-09-25 电脑使我们的生活越来越方便快捷,它是我们生活和工作之中不可缺少的一部分。当我们拥有一台新电脑的时候,如何进行电脑话筒测试?电脑麦克风如何设置?相信有很多朋友会对这些问题感到苦恼,那么下面就由小编为大家介…

java话筒音频_Java调用麦克风话筒和扬声器喇叭进行实时播放

Java调用麦克风话筒和扬声器喇叭进行实时播放 2018-01-12Mr.Xia 4433 次浏览 Java调用麦克风和扬声器实时播放 ``` package com.zhenzhigu.demo; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.SourceDataLine…

C#混音同时录制采集声卡和麦克风话筒

在项目中,我们可能需要同时录制声卡的声音和麦克风的声音,比如直播间,在线教学。那么如何实现呢&#xff1f;当然是采用SharpCapture&#xff01;下面开始演示关键代码&#xff0c;您也可以在文末下载全部源码: 设置授权 第一步&#xff1a;在引用了SharpCapture.dll之后&…

C#采集麦克风话筒声音

在项目中,我们会需要录制麦克风的声音。比如录制QQ聊天时自己说的话。那么如何采集呢&#xff1f;当然是采用SharpCapture&#xff01;下面开始演示关键代码&#xff0c;您也可以在文末下载全部源码: 设置授权 第一步&#xff1a;在引用了SharpCapture.dll之后&#xff0c;调…

LLMs:自然语言处理领域—大语言模型的涉及四大技术领域(TL/USL/PT+Fine/Seq2Seq)、十大核心组件之详细攻略

LLMs:自然语言处理领域—大语言模型的涉及四大技术领域(TL/USL/PT+Fine/Seq2Seq)、十大核心组件之详细攻略 目录 LLMs涉及技术领域的简介 1、迁移学习:特征提取、微调 2、无监督学习技术

6/5~6/6总结

创建存储过程 DELIMITER // CREATE PROCEDURE usingid() BEGIN SELECT AVG(id) FROM user; END // DELIMITER ; 要用DELIMITER //指定结束符为 "//", 要调用该存储过程&#xff1a; CAll usingid; 创建成功后在navicat里面的函数界面可以看见刚刚创建的存储过程…