Java 类与对象实践:从代码验证到四则运算开发

news/2025/10/19 16:00:48/文章来源:https://www.cnblogs.com/bdzb666/p/19150953

Java类与对象实践:从代码验证到四则运算开发

在学习Java类与对象后,通过代码验证课件知识点、完成四则运算开发,能更深入理解面向对象编程思想。以下是我在实践过程中的详细记录,包含知识点验证、问题解决及项目开发过程。

一、课件代码验证与知识点总结

(一)引用类型与原始数据类型差异验证

  1. 验证代码
public class TypeTest {public static void main(String[] args) {// 原始数据类型变量定义int value = 100;// 引用类型变量定义(未引用对象时为null)MyClass obj = null;// 为引用类型变量创建对象obj = new MyClass();System.out.println("原始数据类型值:" + value);System.out.println("引用类型对象字段值:" + obj.getValue());}
}class MyClass {private int value = 200;public int getValue() {return value;}
}
  1. 验证结果:原始数据类型定义时直接分配内存并赋值;引用类型变量初始为null,仅当通过new创建对象后,才指向实际内存空间。
  2. 核心结论:引用类型变量存储对象地址,原始数据类型变量直接存储数据值。

(二)对象判等:==与equals()方法对比

  1. 验证代码
public class EqualsTest {public static void main(String[] args) {MyTestClass obj1 = new MyTestClass(100);MyTestClass obj2 = new MyTestClass(100);MyTestClass obj3 = obj1;// 使用==判等System.out.println("obj1 == obj2:" + (obj1 == obj2)); // falseSystem.out.println("obj1 == obj3:" + (obj1 == obj3)); // true// 使用重写后的equals()判等System.out.println("obj1.equals(obj2):" + obj1.equals(obj2)); // true}
}class MyTestClass {public int value;public MyTestClass(int initValue) {value = initValue;}// 重写equals()方法@Overridepublic boolean equals(Object obj) {if (this == obj) return true;if (obj == null || getClass() != obj.getClass()) return false;MyTestClass that = (MyTestClass) obj;return value == that.value;}
}
  1. 验证结果:==对引用类型比较地址,对原始数据类型比较值;重写后的equals()可实现对象内容(字段值)比较。
  2. 注意事项:实际开发中重写equals()需添加参数有效性检测,如判断obj是否为null、是否为同一类实例。

(三)类字段初始化顺序验证

  1. 验证代码
public class InitializeOrderTest {public static void main(String[] args) {InitializeBlockClass obj1 = new InitializeBlockClass();System.out.println("无参构造创建对象的field值:" + obj1.field); // 100InitializeBlockClass obj2 = new InitializeBlockClass(300);System.out.println("有参构造创建对象的field值:" + obj2.field); // 300}
}class InitializeBlockClass {// 字段初始值public int field = 200;// 初始化块{field = 100;}// 无参构造public InitializeBlockClass() {}// 有参构造public InitializeBlockClass(int value) {this.field = value;}
}
  1. 验证结果:初始化顺序为“字段默认值/初始化块(按代码顺序)→ 构造函数”,构造函数赋值最终生效。
  2. 开发建议:实际项目中应保证一个字段仅初始化一次,避免逻辑混乱。

(四)静态成员与静态初始化块验证

  1. 验证代码
public class StaticTest {public static void main(String[] args) {Employee emp1 = new Employee("张三");Employee emp2 = new Employee("李四");// 通过类名访问静态字段System.out.println("总员工数(类名访问):" + Employee.totalEmployees); // 2// 静态方法调用Employee.clearTotal();System.out.println("清空后总员工数:" + Employee.totalEmployees); // 0}
}class Employee {String name;// 静态字段static int totalEmployees;// 静态初始化块static {totalEmployees = 0;System.out.println("静态初始化块执行");}public Employee(String name) {this.name = name;totalEmployees++;}// 静态方法static void clearTotal() {totalEmployees = 0;}
}
  1. 验证结果:静态初始化块仅执行一次;静态成员可通过类名或对象名访问,推荐使用类名;静态方法只能访问静态成员。

二、四则运算项目开发过程

(一)阶段1:基础版——生成30道小学四则运算题

  1. 功能需求:随机生成30道整数四则运算题(含加减乘除,结果非负),避免除数为0。
  2. 核心代码
import java.util.Random;public class ArithmeticGenerator {public static void main(String[] args) {Random random = new Random();// 生成30道题for (int i = 1; i <= 30; i++) {// 随机生成两个1-100的整数int num1 = random.nextInt(100) + 1;int num2 = random.nextInt(100) + 1;// 随机选择运算符(0:加,1:减,2:乘,3:除)int op = random.nextInt(4);String operator = getOperator(op);// 确保减法结果非负、除法除数非0且结果整数while (!isValid(num1, num2, op)) {num1 = random.nextInt(100) + 1;num2 = random.nextInt(100) + 1;}System.out.printf("第%d题:%d %s %d = \n", i, num1, operator, num2);}}// 获取运算符字符串private static String getOperator(int op) {return switch (op) {case 0 -> "+";case 1 -> "-";case 2 -> "*";case 3 -> "/";default -> "+";};}// 验证题目有效性private static boolean isValid(int num1, int num2, int op) {if (op == 1) { // 减法return num1 >= num2;} else if (op == 3) { // 除法return num2 != 0 && num1 % num2 == 0;}return true;}
}
  1. 运行效果:控制台依次输出30道符合要求的四则运算题,无无效题目(如负数结果、除数为0)。

(二)阶段2:进阶版——题目去重与可定制

  1. 新增功能:支持自定义题目数量、打印方式(控制台/文本文件),并实现题目去重。
  2. 核心优化点
  • 题目去重:将每道题转换为字符串(如“5+3”),存入HashSet,利用集合不可重复性实现去重。
  • 文本文件输出:使用BufferedWriter将题目写入本地文本文件,三题一行排版。
  1. 关键代码(去重与文件输出)
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashSet;
import java.util.Random;
import java.util.Scanner;
import java.util.Set;public class CustomArithmeticGenerator {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 自定义题目数量System.out.print("请输入题目数量:");int count = scanner.nextInt();// 自定义打印方式System.out.print("请选择打印方式(1:控制台,2:文本文件):");int printType = scanner.nextInt();Set<String> questionSet = new HashSet<>();Random random = new Random();BufferedWriter writer = null;try {if (printType == 2) {writer = new BufferedWriter(new FileWriter("arithmetic_questions.txt"));}// 生成不重复题目while (questionSet.size() < count) {int num1 = random.nextInt(100) + 1;int num2 = random.nextInt(100) + 1;int op = random.nextInt(4);String operator = getOperator(op);if (isValid(num1, num2, op)) {String question = num1 + " " + operator + " " + num2 + " = ";if (!questionSet.contains(question)) {questionSet.add(question);// 按打印方式输出if (printType == 1) {System.out.print(question + "\t");// 控制台每三题换行if (questionSet.size() % 3 == 0) {System.out.println();}} else {writer.write(question);writer.write("\t");if (questionSet.size() % 3 == 0) {writer.newLine();}}}}}} catch (IOException e) {e.printStackTrace();} finally {if (writer != null) {try {writer.close();} catch (IOException e) {e.printStackTrace();}}scanner.close();}System.out.println("\n题目生成完成!");}// 复用getOperator与isValid方法,同阶段1
}
  1. 运行效果:输入题目数量(如50)和打印方式(如2)后,本地生成arithmetic_questions.txt文件,文件内三题一行,无重复题目。

(三)阶段3:高级版——答题交互、错题本与数据库连接

  1. 新增功能
  • 答题交互:用户输入答案,实时判断正误,记录答题时间与错题。
  • 错题本与正确率统计:答题结束后显示正确率,支持查看错题并二次答题。
  • 文本导入判题:读取阶段2生成的文本文件,批量判题并输出统计结果。
  • 数据库连接:使用JDBC连接MySQL,将题目、答题记录存入数据库(需提前创建表)。
  1. 核心代码片段(答题交互与错题本)
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;public class ArithmeticQuiz {// 错题实体类static class WrongQuestion {String question;int userAnswer;int correctAnswer;public WrongQuestion(String question, int userAnswer, int correctAnswer) {this.question = question;this.userAnswer = userAnswer;this.correctAnswer = correctAnswer;}}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 假设从阶段2获取题目列表(此处简化为示例题目)List<String> questions = new ArrayList<>();List<Integer> correctAnswers = new ArrayList<>();// 添加示例题目与正确答案questions.add("5 + 3 = ");correctAnswers.add(8);questions.add("10 - 4 = ");correctAnswers.add(6);questions.add("6 * 7 = ");correctAnswers.add(42);List<WrongQuestion> wrongQuestions = new ArrayList<>();int correctCount = 0;long startTime = System.currentTimeMillis();// 答题过程for (int i = 0; i < questions.size(); i++) {System.out.print("请回答第" + (i + 1) + "题:" + questions.get(i));int userAnswer = scanner.nextInt();int correct = correctAnswers.get(i);if (userAnswer == correct) {correctCount++;System.out.println("回答正确!");} else {System.out.println("回答错误,正确答案是:" + correct);wrongQuestions.add(new WrongQuestion(questions.get(i), userAnswer, correct));}}// 答题统计long endTime = System.currentTimeMillis();double accuracy = (double) correctCount / questions.size() * 100;System.out.printf("\n答题结束!用时:%d秒,正确率:%.2f%%\n", (endTime - startTime) / 1000, accuracy);// 错题本功能if (!wrongQuestions.isEmpty()) {System.out.print("是否查看错题本并二次答题?(1:是,2:否):");int choice = scanner.nextInt();if (choice == 1) {int retryCorrect = 0;for (WrongQuestion wq : wrongQuestions) {System.out.print("二次答题:" + wq.question);int retryAnswer = scanner.nextInt();if (retryAnswer == wq.correctAnswer) {retryCorrect++;System.out.println("回答正确!");} else {System.out.println("仍错误,正确答案是:" + wq.correctAnswer);}}System.out.printf("二次答题正确率:%.2f%%\n", (double) retryCorrect / wrongQuestions.size() * 100);}}scanner.close();}
}
  1. 数据库连接说明:需导入MySQL驱动包(如mysql-connector-java-8.0.30.jar),创建arithmetic_questions(存储题目)和answer_records(存储答题记录)表,通过JDBC实现数据插入与查询。

三、实践总结与收获

  1. 知识点巩固:通过代码验证,深入理解了引用类型、对象判等、初始化顺序、静态成员等核心概念,纠正了“equals()默认比较地址”“静态方法可访问实例成员”等误区。
  2. 开发能力提升:从基础功能到高级交互,逐步掌握了需求分析、逻辑设计、代码优化(如去重、文件操作)的流程,学会了使用集合、IO流、JDBC等技术解决实际问题。
  3. 问题解决思路:面对“题目去重”“无效题目过滤”等问题,通过查阅资料、调试代码,学会了利用HashSet特性、添加有效性校验等解决方案,培养了debug能力。

需要的话,我可以帮你整理一份四则运算项目完整代码包,包含各阶段源码、数据库建表语句和使用说明,方便你直接运行和补充到博客中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/940394.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025手持光谱仪厂家推荐:一诺机电精准分析,便携高效检测首选!

2025手持光谱仪厂家推荐:一诺机电精准分析,便携高效检测首选!随着科技的不断进步,手持光谱仪/光谱分析仪/便携式光谱仪在矿石/元素分析、合金/金属/不锈钢/铝合金、贵金属、三元催化等领域的应用越来越广泛。然而,…

HTML5中常用的布局语义标签

块元素(block element)在页面中,块元素独占一行; 在网页中一般通过块元素来对页面进行布局。 块元素中可以放块元素和行内元素。 行内元素(inline element)在页面中,行内元素不能独占一行;行内元素主要用来包裹…

Jupyter直接转pdf

需要安装Jupyter nbconvert 中文 PDF 模板(github地址 https://github.com/AllanChain/nb-tmpl-ctex,点个免费的星星吧) Chinese LaTeX/PDF template for Jupyter notebook nbconvert using CTeX. 安装 pip install…

DP优化:四边形不等式、决策单调性与凸性

考虑 \(a\leq b\leq c\leq d\) 最小化问题中,四边形不等式为 \(w(a,c)+w(b,d)\leq w(a,d)+w(b,c)\)。 最大化问题中,四边形不等式为 \(w(a,c)+w(b,d)\geq w(a,d)+w(b,c)\)。 交叉优于包含。 文中默认讨论最小化问题。…

智慧交通项目:Python+PySide6 车辆检测框架 YOLOv8+OpenCV 自定义视频 自定义检测区域 (源码+文档)✅

智慧交通项目:Python+PySide6 车辆检测框架 YOLOv8+OpenCV 自定义视频 自定义检测区域 (源码+文档)✅pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: b…

WPS中Mathtype插件消失不见解决方法

本文解决WPS顶栏Mathtype插件使用一段时间后会消失不见的问题。 方案一:按照上述操作,出现如下方框点击模板,会出现Mathtype相关插件,按照下图示操作最后,重新启动WPS,即可看到顶栏会出现Mathtype选项。 方案二:…

list 实现链表封装节点的底层逻辑:如何克服不连续无法正常访问挑战 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025气泡膜机优质厂家推荐:瑞康机械,高效生产与定制服务兼备!

2025气泡膜机优质厂家推荐:瑞康机械,高效生产与定制服务兼备!随着电子商务和物流行业的迅猛发展,包装材料的需求量也在不断增加。气泡膜作为一种重要的缓冲包装材料,其生产设备——气泡膜机/气泡膜制袋机/高速气泡…

音视频编解码全流程之用Extractor后Decodec - 实践

音视频编解码全流程之用Extractor后Decodec - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

P8817 [CSP-S 2022] 假期计划 解题笔记

给一个不用dp的做法 solution 考虑朴素做法。 预处理出 \(f(x)\),表示距离 \(x\) 不超过 \(k\) 的点。 枚举每个景点 \(a\), \(b\), \(c\), \(d\),通过预处理出的 \(f(x)\) 计算是否合法,更新答案。 这样时间复杂度…

2025年塑料托盘厂家推荐排行榜,网格川字/九脚/田字/双面塑料托盘,平板/吹塑/注塑/焊接/印刷/组装款/高矮脚/反川字/立体库托盘公司精选!

2025年塑料托盘厂家推荐排行榜:网格川字/九脚/田字/双面塑料托盘,平板/吹塑/注塑/焊接/印刷/组装款/高矮脚/反川字/立体库托盘公司精选!随着物流和仓储行业的快速发展,塑料托盘作为重要的物流工具,其需求量逐年增…

20243866牛蕴韬类和对象作业

https://files.cnblogs.com/files/blogs/847621/20243866牛蕴韬类和对象作业.zip?t=1760859411&download=true

【动手学深度学习PyTorch】softmax回归 - 实践

【动手学深度学习PyTorch】softmax回归 - 实践2025-10-19 15:38 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: …

简单学习Typora

Markdown学习 标题: 二级标题 三级标题 字体 字体左右两边加两个星号xx就直接变为粗体 字体左右两边加一个星号xx就直接变为斜体 字体左右两边加三个星号xx就直接又斜体又加粗 hello 引用符号为引用分割线三根线或者是…

Gamma 函数

闲话(中文) 河溢危,禾已萎,鹤依偎。禾异味,鹤已畏,合一,谓何?"异味?"何矣,味何?以萎。何异胃颌已危,何医为?河易为河医。为何?医喂荷以维何一胃。何已维。"颌医未。"何矣,胃颌易维…

物理感知 RTL 合成

1、PAS:缩短设计闭环的先锋技术 物理感知合成(PAS)将物理设计信息(如布局、连线、拥塞、功耗)提前纳入 RTL 合成阶段,使合成结果与后端布局更一致,从而减少反复迭代,提升设计效率与 PPA(性能-功耗-面积)表现…

在线p图(PhotoShop网页版)加滤镜,3步搞定唯美照片

在当今生活中,分享精美照片已成为我们日常的一部分。无论是诱人的美食、精致的自拍,还是旅途中的风景,一张风格独特、色彩动人的照片总能迅速赢得朋友们的点赞。其实,想要修图加滤镜,不必再安装笨重的软件——只需…

24_envoy_配置静态资源路由

Envoy配置静态资源路由完全指南 总起:Envoy静态资源路由的重要性与挑战 在现代Web应用架构中,静态资源(如HTML、CSS、JavaScript、图片等)的高效分发是提升用户体验的关键因素。Envoy作为云原生时代的高性能代理,…

2025年冷却塔厂家推荐排行榜,闭式/方形/工业/全钢/凉水/圆形/玻璃钢/防腐冷却塔公司推荐!

2025年冷却塔厂家推荐排行榜,闭式/方形/工业/全钢/凉水/圆形/玻璃钢/防腐冷却塔公司推荐!随着工业和建筑行业的快速发展,冷却塔作为关键的热交换设备,在各个领域中发挥着重要作用。为了帮助筛选冷却塔、闭式冷却塔…

AT_toyota2023spring_final_g Git Gud

AT_toyota2023spring_final_g Git Gud (tsinsen Di6ns) 图论、树上问题、贪心、Ad-hoc定义:一个点度数 \(deg_u\) 为被合并次数;一个点集度数 \(deg_S\) 为点集内点与点集外点连边数(一条边即一次合并) 结论1:合并…