目录

2024-04-21-Java程序设计以及实验指导-实验笔记

Java程序设计以及实验指导 实验笔记

实验笔记


Java程序设计以及使用指导实验笔记,原创文章,转载请注明出处(2021年12月13日注)

笔记配套源码: [https://gitee.com/xiaoxingbobo-personal/java-dome

https://i-blog.csdnimg.cn/blog_migrate/c61f4ffe638d64fdf70c25b47c532bd2.png

目录


第一章 Java语言概述

一、 实验操作

  1. 1.Java环境变量的安装
  2. 2.eclipse编译器的安装
  3. 3.控制台接收输入,控制台输出接收的数字
  4. 4.猜字游戏
  5. 5.去最大值和最小值,求平均分

二、遇到的问题及解决方法

1、问题:环境变量配置不正确

解决方法:环境变量必须要配置到bin目录下

2、问题:Scanner无法实例化

解决方法:导入Scanner包

3、创建了Scanner对象时,忘记传入参数System.in对象,导致报错

三、小结

1、学习了环境变量的配置,eclipse的安装,以及Scanner类接收键盘输入,知道了jdk是Java的开发环境,jre是Java的运行环境,jdk中已经包含了jre不用单独安装,java是通过javac.exe这个程序进行编译Java源码为字节码,然后用java.exe在JVM虚拟机中运行程序。

2、掌握Java使用Random生成随机数,使用Scanner类接收键盘输入的数字,通过判断用户输入的数字是否比生成的随机数大还是小,实现了猜字游戏

3、System.Out.println()在控制台打印字符串

第二章 Java编程基础

一、实验操作

1、求水仙花数

2、使用双重for循环求素数

3、冒泡排序

4、输出九九乘法表

5、猴子吃桃子问题

6、switch case分支实现数字查询星期

7、测试i++与++i的区别

8、n个小孩围成一圈,顺序排号。每个从1-3开始报数,报到3退出圈外,最后剩下的是几号的算法。

二、遇到的问题及解决方法

1、求水仙花数时,怎么取到一个数字中的个,十,百,

解决方法:通过i%10取出个位,通过i/10%10,取出十位,通过1/100,取出百位

2、输出九九乘法表,隐藏多余第2个for的上届时上第一个for循环的项

三、小结

1、学习了Java数据类型,分为基本数据类型和应用数据类型,如下图:

https://i-blog.csdnimg.cn/blog_migrate/88f3dea08028f1a9dba22bf1e59d1aea.png

2、java中的for-each语法(与C#语言有所区别):

String[] strArray = {"张三", "李四"};
for (String item : strArray) {
    System.out.println(item);

}
  1. 使用双重for循环实现冒泡排序,每次通过下标取出数组中的数组与后一个进行比较,再通过第三个变量来进行交换两个数值;
  2. Java语言中,标识符(变量名,类名等)有字母、数字、下划线和美元符号$组成,且不能以数字开头;
  3. Java语言命名规范:包名一律小写,类名大驼峰,属性名(变量名)和方法名都是小驼峰,且方法名一般以动词开头,常量全大写,如果是多个单词组成的常量名则使用_进行分割。
  4. Java语言单行注释//,多行注释/多行注释的内容/
  5. 区别break、continue、return:break主要用于循环中,结束循环,若是多层嵌套循环则在遇到break时直接结束所有循环,continue也主要用于循环中,当遇到continue时,结束本次循环,进入下一次循环,return则直接结束该函数的调用,不会继续往后执行。
  6. 区别do-while和while循环,do-while无论条件是否满足都要执行一次循环体,也就是先执行循环体,再进行判断,while先判断条件,再执行循环体。
  7. 区别–i和i–,–i先执行i-1再赋值给i,i–则是i先赋值给i,再进行i-1,再赋值给i
  8. Java创建二维数组(与c#区别int[,] ar=new int[,]{})
int ar[][] = new int[][]{
        new int[]{1, 2}
};

第三章 类与对象

一、实验操作

1、调试子类继承父类,重写父类方法,使子类也拥有父类的方法,也可以对父类的方法进行扩展。

2、静态类,抽象类的实现重写

3、银行信用卡的存取操作案例

4、统计一个字符串中某个字符出现的次数

5、值传递和引用传递

二、遇到的问题及解决方法

1、子类继承父类的时候,给属性赋值报错。

2、当父类中存在有参构造函数时,必须创建无参数构造函数,否则子类在继承时报错

解决方法:给父类的属性添加 gettersetter 方法,然后及可以通过“<属性名>.get<属性名>”进行获取值,赋值通过“<属性名>.set<属性名>”进行赋值

三、小结

  1. 学习了类与对象,类:对象现实生活中的具有相同属性的某个事物进行抽象出来,对象:一切皆对象,Java中所有类型都归属于Object类。
  2. 面向对象三大特效:封装、继承、多态
  3. 类的声明使用 Class 关键字
  4. Java的访问修饰符:
        1. private :私有的,只能在当前类访问
        2. public :公开的,所有对象可以访问
        3. protect :只能给子孙子类访问
  5. 构造方法:类被创建时会被调用的方法,方法无返回值,方法名称和类名相同
  6. 方法重载:同名不同参数——方法名称相同,参数类型或者参数个数不相同
  7. 静态类,通过关键字static修饰,调用时无需new,直接通过“<类名>.<静态方法名()>,静态方法只有一个,在编译时就创建,实例方法是通过new关键字创建的,可以有多个。
  8. Java :通过声明静态的类对象,直接通过getInstance方法获取该类,getInstance是静态的,可以保证类对象时唯一的。
  9. 比较字符串使用==比较的是地址,如果需要比较内容是佛相等则使用equals进行。
  10. 值传递与引用传递,值传递只把内存地址中的值进行传递,引用传递把是对象的地址给传递过去,操作的是同一个内存地址。
  11. String类、StringBuffer类、StringBuilder,String字符串类,StringBuffer类对象可以进行字符串的拼接,插入等,但相比于String类的操作,不会产生垃圾对象(无指针指向的内存),而StringBuilder只是在StringBuffer对象的方法上加synchronized,保证了字符串互斥访问的安全。

第四章 继承与多态性

一、实验操作

1、子类继承父类的属性和方法

2、重写父类的普通方法,重写抽象方法以及实现接口

3、构建重载方法,实现java面向对象的多态的特性

4、Java实现简单工厂设计模式

二、遇到的问题及解决办法

暂无

三、小结

1、子类通过extends关键字继承父类,继承父类后通过super关键字获取到父类,通过implement实现接口,接口也是特殊的抽象类

2、子类重写父类方法使用@Override关键字,子类不能重写父类的静态方法

3、使用final关键字的属性为常量,是不可以修改的

4、Java包装类,包装类把java基本数据类型包装成对象,对象都可以赋与null值。

5、instanceof()用于判断某对象是否是某特定类型或者子类,用法instanceof()

6、工厂模式隐藏对象创建的复杂性,实现面像接口或者抽象类进行重写或者扩展。

第五章 异常处理

一、实验操作

1、判断字符长度是否超过20,超过则报StringTooLongException异常

2、编写自定义异常类

3、先进先出队列,栈空栈满异常

二、遇到的问题及解决方法

暂无

三、小结

1、Java封装了大量的异常处理类,常见异常类:IOException(I/O操作异常类),IllegalAccessException(对类访问被拒绝),FileNotFoundException(不能找到文件)

2、使用try(此处是被包裹的资源)包裹资源,可实现资源用完自动关闭,比如数据流,数据库的连接等都可以通过try()包裹自动关闭资源

3、自定义异常类通过继承Exception类即可,主动触发异常通过throw new 自定义异常的类名()触发自定义异常

第六章 Java常用类

一、实验操作

  1. 使用System类实现统计程序运行时间
  2. 使用Random类实现猜字游戏
  3. 使用Date和Calendar类实现输出今年日历
  4. 使用正则表达式匹配电子邮箱格式是否正确
  5. 定时器输出当前时间

二、遇到的问题及解决办法

  1. 猜字游戏中,接收用户收入的是String类型,Random产生的随机数是int类型,导致不匹配,通过把用户输入的字符转换为int类型进行匹配。

三、小结

  1. 日期和时间的操作类Date和Calendar,推荐使用Calendar类,比Date更强大,单例方法getInstance()方法可直接获得Calendar对象
  2. 时间格式类:DateFormat和SimpleDateFormat类,SimpleDateForam类与语言环境相关的方式来格式化,用户也可以通过applyPattern()自定义格式化的格式
  3. Math类,可实现数学函数的运算,平方、平方根、四舍五入等操作。
  4. Random随机数类,通过nextInt(10)会产生一个0-10的左闭右开区间的随机
  5. BigInteger(高精度整形)和BigDecimal(高精度小数)类用于高精度的计算;
  6. 正则表达式:Pattern类用于创建一个正则表达式,Matcher类用于匹配是否满足正则表达式;
  7. Comparable是排序接口,若一个类实现了Comparable接口,就意味着“该类支持排序”。而Comparator是比较器,我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。

第七章 泛型与集合

一、实验操作

1、使用LinkedList模拟队列和栈,使用往队列中添加数据,再取出数据,了解队列的原理;

2.Java读取和创建properties文件,保存程序的一些配置文件;

3、设计BaseDao、BaseService、BaseDaoImpl、BaseServiceImpl模式框架,继承基类或者实现接口;

4、使用Map、Set实现通讯录(增删改查)

二、遇到的问题及解决办法

暂无

三、小结

1、泛型提高了java数据类型的安全,提高了代码复用性。

2、使用Properties对象实现配置文件的读取和写入功能,使用outputStream读入配置流,使用FileInputStream写入配置文件;

3、泛型的上限和下限:泛型通过 extends继承父类来设置上限,super设置下限,该功能用于编写基类有教大帮助。

4、泛型通配符:?,用法Point,用于表示接收任何泛型

4、区别List、Set、Map:List列表,内容有序排列,Set列表,唯一区别于List的是,不能存在重复值,且是无序,无法通过下标访问元素,Map键值对,以Key-Value的方式进行存储。

第八章 多线程

一、实验操作

  1. 使用继承Thread类实现多线程,与主线程死循环输出文字
  2. 使用实现Runnable接口创建多线程
  3. 异步实现售票系统,互斥访问处理
  4. 创建线程池,把任务提交给线程池

二、遇到的问题及解决办法

暂无

三、小结

  1. 学习了使用Java多线程写程序,通过继承Thread类和实现Runnable接口创建线程,掌握在run方法中编写运行程序,实现并行控制台输出程序;
  2. 使用线程的join方法限制主线程的执行,必须等待使用了join的子线程执行结束后才能继续执行。
  3. 使用synchronized代码块(方法)和LOCK.lock()解决互斥访问的问题。
  4. 使用属性setDeamon(true)设置子线程为守护线程。
  5. 线程池:解决重复创建线程和销毁线程而产生的一个替代品,可以实现线程的重复利用。

第九章 Java I/O

一、实验操作

1、读取记事本内容,再输出到记事本文件

2、修改文件扩展名,重命名,复制,删除操作

3、通讯录程序

4、使用Scanner类读取文件

二、遇到的问题及解决办法

1、写出记事本文件内容的时候,乱码

解决办法:设置写出编码"UTF-8"

三、小结

1、OutputStream类的继承层次结构

https://i-blog.csdnimg.cn/blog_migrate/c549c0aaa0ee9a96e9eecfeb96c424b8.png

  1. 文件的操作:File类
  2. 文件流:文件内容的操作,FileInputStream和FileOutputStream文件流类
  3. Scanner主要用于控制的接收输入,还可用于文件的读取
  4. 缓冲流:BufferedInputStream和BufferedOutputStream把流先读取到缓冲区,再一次性写入目标数据源,提高读写效率。

第十章 图形用户界面

一、实验操作

1、构建Frame窗体,实现登录界面和信息查看,修改的窗体,以及单机事件等。

2、使用Toolkit获取屏幕尺寸,实现窗体居中

3、JFrame常用组件的创建

4、IntelliJ IDEA安装JFormDesigner插件,实现Java的可视化编写窗体程序。

二、遇到的问题及解决办法

1、流布局中,组件怎么实现垂直排列?

解决办法:查询资料后,得知Box.createVerticalBox()可创建一垂直布局容器。

  1. 在JMenu中的JMenuItem组件绑定MouseClicked事件无效

解决办法:绑定为AcitonListener中的actionPerformed事件

三、小结

1、面板类JPanel,中间容器,与布局管理配合使用,可以实现流布局和网格布局

2、使用getContentPane获取当前JFrame的JPanel

3、组件事件的绑定,主要有2种方式,实现 ActionListener接口和创建事件适配器类,在组件的事件属性里面直接创建事件适配器类均可以实现组件的事件绑定。

第十一章 网络编程

一、实验操作

1、InetAddress类获取域名解析的IP地址,已经获取本机IP地址

2、基于TCP协议的Socket类和ServerSocket类实现及时通讯,结合第10章内容,仿QQ聊天程序。

3、基于UDP协议的DatagramSocket搭建客户端和服务端,以流的传输方式实现聊天程序

4、基于UDP协议的DatagramSocket搭建客户端和服务端,以DatagramPacket数据包传输实现聊天窗体程序

二、遇到的问题及解决办法

1、报错:端口被占用,切换端口即可

三、小结

1、URL类读取网页资源

3、Socket通讯编程5步骤:

(1)客户端创建ServerSocket对象,调用accept()方法监听

(2)在客户端创建Socket对象连接服务器

(3)建立连接后,客户端和服务器端都打开与对方相连的输入/输出流

(4)客户端和服务端关闭输入/输出流,与对方发送和接收数据

(5)客户端和服务端关闭输入/输出流和Socket连接

4、InetAddress解析域名所指向的服务器IP地址,以及本机IP地址

5、基于UDP的DatagrmSocket的类用于编写网络通讯类,如果只使用DatagramSocket,那个传输采用流的方式进行,也可以配合上DatagramPacket,则可以实现数据包的形式进行传输数据。这种基于UDP的协议传输是双向的长连接,这点区别于只是HTTP的一次连接。

Java扩展 JDBC连接MySql数据库

一、实验操作

  1. 实现简单数据库增删改查操作
  2. 根据Java的面向对象的特性,对数据库连接操作的重复代码进行封装,实现一个通用连接和操作数据库的工具类DBHelper。
  3. 结合第10章内容编写一个实现登录,查看信息的窗口应用程序。

二、遇到的问题及解决办法

  1. 数据库版本过高,与jdbc版本不兼容,通过查询后修改为合适的jdbc版本。
  2. 往数据库插入数据时,发现数据库乱码,设置MyEclipse和数据库的编码格式为统一的utf-8,乱码问题得以解决
  3. jdbc的jar包不建议全局配置,项目更换主机后,不能保证每台主机都配置了jdbc,建议在项目目录下创建lib,添加jdbc包,导入到目录里面,jar包会跟着项目走,迁移性更强。

三、小结

  1. 通过使用了jdbc大大简化了数据库的操作,可实现多数据库,多平台,兼容的多数据库。
  2. 使用jdbc中的ExecuteUpdate执行增、删、改的sql语句,返回int类型的受影响的行数
  3. 使用jdbc中的ExecuteQuery执行查询的sql语句,放回DataSet对象
  4. jdbc操作数据库的5大步骤:
        1. Class.forName加载jdbc驱动
        2. DriverManager对象连接到数据库
        3. 把SQL语句放到连接对象的PreparedStatement中
        4. 使用PreparedStatement执行executeUpdate(修改)或者ExecuteQuery(查询)
        5. 关闭数据数据库连接

68747470733a2f2f626c6f67:2e6373646e2e6e65742f62616964755f33393130353536332f:61727469636c652f64657461696c732f313231393135303833