Java 和 OOP 入门笔记
(部分题目内容和判题程序由 AI 生成,其余内容为手写)
技术栈扩展
学网安的要精通前后端、二进制才能游刃有余,前后端工程师纷纷在往全栈跑,AI 发展起来了大家又一窝蜂往深度学习钻,Vibe Coding 的同质化和垃圾的产出又迫使着每一个人学会 UI 设计和产品经理思维,现在的 CS 就是一人成军,如果你不多学几门技术栈,那么在 AI 发展起来的未来真的是毕业即失业。
由于我在 2026.9 的时候参加了学校社团的招新,了解了前端、ML 和网安的一些内容,学校(至少培养方案是这么说的)会涉及到 C 语言和更底层的东西,而 PM 思维需要在真实环境中不断打磨,那么最好的起步路线就是学习后端。
怎么学
由于我之前完全没有接触过 Java,面向对象编程也有点忘了,然后现在 AI 又非常厉害,我想探索一下 AI-based Learning。
具体而言,我会在 Gemini 的指导和帮助下实现几个示例。
前备知识
磨刀
我忘了多久开始用的 VSC 写代码,但是我一开始用 VSC 之后就停不下来了,我几乎所有代码都是在这里写的,包括我的博客文章也是在 VSC 里面写的。
但是 VSC 仍然有其局限性。所以我换成了 IDEA Ultimate。学生有一年的使用资格,如果不是学生也可以发动鬼脑(ckey.run)自己找。不得不说,IDEA 还是对 Java 有很强的语言适配,会体现在很多小细节上面。所以如果写 Java 项目的话还是老老实实用 IDE 吧,重是重了点,但是从使用体验上而言是值得的。
OOP 和 POP
POP 是“先做什么,后做什么”,核心是函数,数据和函数分离。
OOP 是“谁怎么样,谁干什么”,核心是类与对象,对象本身就是一系列数据和行为的结合体。
Java 与 JavaScript 的一些重要区别
- Java 有编译的过程。Java 离不开 JVM,JavaScript 离不开 V8(或者其他引擎),看似两者都需要操作系统特定的一个底层工具跑代码,但是也有分别。Java 有一个编译过程,其编译的结果是字节码,字节码在 JVM 上最终翻译成机器码。
- Java 有方法重载。这一点在后面会解释。
- Java 是强类型的。需要了解 Java 的一些类型和不同的作用机制,防止类型不匹配出现错误。
- OOP 和 POP。见上。
- 空值处理。Java 没有 undefined,同时如果访问 null 会报 NullPointerException。
- 判等。注意双等号和三等号,以及
.equals()的使用。 - 异步。不同于 JS 的
async/await或者 Promise,Java 默认同步,但是可以采用线程池机制实现异步。
Lab 1 从零开始的矩阵
你需要使用纯 Java 编写一个基础的 Matrix 类,实现矩阵的底层数据结构定义,并封装矩阵的格式化打印、矩阵转置、矩阵加法、数乘以及核心的矩阵乘法运算,以此迈出从面向过程到高级面向对象编程(OOP)的第一步。
了解项目结构
建立项目之后在 Main.java 里面。但是新的类应当分开(“低耦合”),于是 src 新建一个 Java 类,填入名字 Matrix。之后矩阵的代码就在 Matrix.java 里面写。Main.java 里面就写一个调用矩阵完成各项运算的小程序吧。
需要注意同包内互相引用不需要 import,直接写类名就行。如果是 JS 就需要用 module.export 以及 require。
矩阵需要有什么
一个类需要有属性(字段)、构造器(类的初始化)、方法(功能)。对于矩阵,主要就是行数列数和里面的数。
1 | public class Matrix { |
实现方法
这里主要考虑怎么把数学语言翻译成程序语言。
this 的运用
- 用 this.rows = rows 区分参数与变量
- 在二元运算中,明确区分主调方
this.data[i][j]与传入对象m.data[i][j],防止误写为“自身加自身”。
方法重载
同一个类里,方法名相同、参数列表不同。编译器会自行决定用哪个方法。在实现数乘和向量乘法的时候就可以写在一起。
最终代码
1 | public class Matrix { |
判题
1 | public class Main { |
预期结果为 AC。
Lab 2 逐渐复杂的矩阵
在 Lab 1 的基础上,你需要引入更复杂的线性代数数学逻辑,实现方阵/对称/反称矩阵的性质判断、生成单位矩阵,并攻克求行列式和求逆矩阵的核心算法,同时通过重写 toString() 方法 来优雅地输出矩阵内容。
Lab 3 从本地类到内存 API
通过引入 Spring MVC 框架,将 Lab 1 & 2 编写的本地 Matrix 运算逻辑包装为可以通过 HTTP 协议访问的 Web API,并对齐前端 Axios 的异步请求规范。你需要创建 DTO、实现
- POST /api/matrix/multiply
- POST /api/matrix/determinant
- POST /api/matrix/inverse
三个 API 接口,并且解决跨域问题。
Lab 4 控制权反转与异常拦截
在 Lab 3 中,你可能把所有的矩阵计算逻辑直接写在了 Controller 的方法里,或者在 Controller 里通过 Matrix myMatrix = new Matrix() 手动实例化了对象。在工业级开发中,这种做法会导致代码高度耦合。如果计算逻辑需要修改,或者需要切换多线程版本,你就必须大面积修改 Controller。
Lab 4 的核心目的就是:干掉一切手动的 new 操作,将对象的创建和管理权全部上交给 Spring(控制反转 IoC),并在需要的地方自动注入(依赖注入 DI)。同时,我们要利用 Spring 的 AOP(面向切面编程)思想,建立一个“全网捕鱼”的中央错误拦截机制。
你需要将所有计算逻辑抽离到由 @Service 宣告的业务层,在控制器中改用 @Autowired 自动注入以干掉所有手动的 new 操作(IoC/DI),同时利用 @RestControllerAdvice 编写全局异常处理器,统一拦截数学错误(如矩阵不可逆),避免向前端 Axios 暴露不友好的 500 堆栈报错。
Lab 5 持久化 MYSQL 数据库
内存数据随进程结束而释放。本实验要求你引入 MySQL 关系型数据库与 MyBatis-Plus 生态,完成将 Web 端计算产生的矩阵历史记录进行持久化(写入硬盘)的功能。
你需要在本地或容器中配置 MySQL 数据库,在 application.yml 中配置连接,利用 MyBatis-Plus 建立实体类与数据库表的 ORM 映射,使得每次计算成功时都将计算矩阵及结果持久化存入硬盘,并提供一个 GET /api/matrix/history 接口,调用 list() 方法查出所有的计算历史展示给前端。
Lab 6 Matrix Agent Gateway
作为最后一个 Lab,你需要使用 Spring 内置的 RestTemplate 或 WebClient 在 Java 后端向大模型(如 DeepSeek、OpenAI)发送带有 API Key 的 POST 请求,将前端传来的“人话”指令投喂给 AI 转换为结构化矩阵数据,随后在本地调用你的 MatrixService 完成硬核计算,体验自然语言驱动的智能体网关开发。