面向对象程序设计完结撒花❀
面向对象程序设计完结撒花❀
一 前言
本学期的java课程总体而言让我收获颇丰,虽说前期对java面向对象编程不够熟悉时经常完成任务和作业完成的焦头烂额,不过后期步入正轨后会发现自己收获真的很大,不管是对于逻辑思维较强的算法有敢于不断试错的勇气还是对于麻烦的环境配置一点点去探索的成就感都让我意识到自己已然初步向一个合格的程序员这条道路开始迈进。
关于Blog作业:这一点我认为教学组老师安排的非常合理,每个小学习阶段的总结与反思是学习道路上必不可少的一环,通过Blog的编写可以让我们去思考自己上一阶段存在的不足,同时促进我们在接下来的学习过程中避免踩坑,不断纠正自己的学习方法与态度。
PTA:PTA感觉除了前期电梯真的让我觉得前景惨淡后期难度都比较友好,不过航运系统以后的题目感觉稍稍简单了点没有像之前航运系统的题集那样让我对类的布局和安排产生更深的理解。可以稍微提升一咪咪的难度
实验:实验本身非常好,前情提要比较生动有趣,动物的强弱互吃也符合现实生活,理解上没有困难,同时通过动物进入冰箱和排序让我们对于类和抽象类以及接口和collection排序有了更深的理解。但是实验系统真的很麻烦,完全能理解老师希望我们自己动手敲一遍代码的苦心,但是实验系统之前不能复制粘贴到IDEA里导致一个简单的拼写错误需要找半天真的很烦人。
线上课及线下课:老师讲的很清晰,先线上再线下的搭配也配合的很好,工作量适中,但是学堂在线的题目有点一言难尽,有的题目答案是错的,而且填空题顺序不一样或者说法不一样(但同一个意思)直接给我判错,这一点我要狠狠狂喷,希望老师可以进行改进。
二 面向对象技术总结
在面向对象的学习过程中我发现他与面向结果编程真的很不一样,
面向对象编程 (OOP)
核心:以“对象”为基本单元,强调对现实世界的抽象(封装、继承、多态)。
目标:通过组织代码结构来提高可维护性、复用性和扩展性。
关键概念:类、对象、方法、属性、继承、接口等。
面向结果编程 (ROP)
核心:以“结果”为导向,关注任务的最终输出而非实现过程。
目标:快速达成业务目标,通常通过组合现有工具或服务来实现功能。
关键概念:任务分解、结果链、服务调用、数据流等。
同时因为java语言对一些基本的数据结构进行了封装,我们只需要调用这些方法就行(比如sort ArrayList LinkedList·等),这一点比起C语言要方便许多。
下面是本人对于面向对象编程的一些基本概念的理解
1. 封装性(Encapsulation)
封装性通过访问控制(如 private 关键字)隐藏类的内部实现细节,仅对外提供必要的访问接口。例如,在 Circle 类中,半径(radius)设为私有属性,外部无法直接修改,只能通过 getArea() 方法获取面积,从而确保计算逻辑的安全性。这种方式与现实世界的使用方式一致——用户只需知道如何调用功能,无需关心内部实现。
2. 继承(Inheritance)
继承允许子类复用父类的属性和方法,形成层次化的类结构。Java 采用单继承机制(一个类只能直接继承一个父类),但通过接口(interface)实现多重继承的效果。例如,Dog 类可以继承 Animal 类,同时实现 Runnable 接口。
3. 接口(Interface)
接口是一种完全抽象的类,仅定义方法签名(无具体实现),支持多重实现。例如,Drawable 接口可以声明 draw() 方法,由不同类(如 Circle、Rectangle)实现各自的绘制逻辑。接口适用于描述“能力”(如 CanFly),而抽象类更适用于“本质”关系(如 Bird extends Animal)。
4. 多态(Polymorphism)
多态允许父类引用指向子类对象,分为两种形式:
- 上转型(Upcasting):子类实例自动转为父类类型(如 Animal a = new Dog())。
- 下转型(Downcasting):父类实例强制转为子类类型(需显式转换,如 Dog d = (Dog)a)。
5. 抽象类(Abstract Class)
抽象类不能被实例化,用于定义通用属性和方法,要求子类实现抽象方法。例如,Shape 抽象类可定义 calculateArea() 方法,由子类 Circle、Square 分别实现具体逻辑。抽象类强调“是什么”(is-a),接口强调“能做什么”(can-do)。
6. 异常处理(Exception Handling)
异常是程序运行时的错误,通过 try-catch-finally 结构捕获并处理异常,确保程序健壮性。例如:
try { int result = 10 / 0; // 抛出 ArithmeticException } catch (Exception e) { System.out.println("Error: " + e.getMessage()); } finally { System.out.println("Cleanup code here."); }
使用 throw 关键字可主动抛出异常(如参数校验失败时)。
7. JavaFX GUI 开发
JavaFX 在实验项目中用于图形用户界面的设计和开发。通过学习和实践,掌握了 JavaFX 的基本控件使用,如按钮、文本框、标签等,以及布局管理器的应用,能够设计出简单的图形用户界面。例如,在一个简单的学生信息管理系统的界面设计中,使用 JavaFX 创建了包含输入框、按钮和表格的界面,实现了基本的用户交互功能。
但 JavaFX 的功能非常丰富,对于一些高级功能,如动画效果、自定义控件等,还处于初步了解阶段,需要进一步深入学习和探索,以满足更复杂的界面设计需求。
这是之前翻转课堂我做的案例,感觉挺有意思的,在这里分享一下
import javafx.application.Application; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.CheckBox; import javafx.scene.control.Label; import javafx.scene.control.ScrollPane; import javafx.scene.text.TextFlow; import javafx.scene.text.Font; import javafx.scene.paint.Color; import javafx.scene.layout.*; import javafx.scene.text.FontWeight; import javafx.scene.text.Text; import javafx.stage.Stage; import java.util.ArrayList; import java.util.List; public class Main extends Application { private Stage primaryStage; private Scene startScene, choiceScene, resultScene; private VBox choiceContainer; private List<CheckBox> checkBoxes = new ArrayList<>(); private Label resultLabel; @Override public void start(Stage primaryStage) { this.primaryStage = primaryStage; primaryStage.setTitle("日式RPG之NCHU冒险"); primaryStage.setResizable(false); // 初始化所有场景 initStartScene(); initChoiceScene(); initResultScene(); // 显示开场场景 primaryStage.setScene(startScene); primaryStage.show(); } // 初始化开场场景 private void initStartScene() { // 创建背景 VBox root = new VBox(); root.setPrefSize(800, 600); root.setStyle("-fx-background-color: #1a1a2e;"); // 对话窗口 TextFlow dialogueBox = new TextFlow(); dialogueBox.setPadding(new Insets(20)); dialogueBox.setPrefSize(700, 200); dialogueBox.setStyle("-fx-background-color: rgba(0, 0, 0, 0.7); -fx-background-radius: 10;"); // 对话文本 Text dialogueText = new Text(); dialogueText.setFont(Font.font("SimHei", FontWeight.NORMAL, 16)); dialogueText.setFill(Color.WHITE); dialogueBox.getChildren().add(dialogueText); // 滚动面板 ScrollPane scrollPane = new ScrollPane(dialogueBox); scrollPane.setFitToWidth(true); scrollPane.setPrefSize(700, 200); scrollPane.setStyle("-fx-background-color: transparent; -fx-padding: 20;"); // 按钮容器 HBox buttonBox = new HBox(20); buttonBox.setAlignment(Pos.CENTER); buttonBox.setPadding(new Insets(20)); // 继续按钮 Button continueBtn = new Button("继续"); continueBtn.setFont(Font.font("SimHei", FontWeight.BOLD, 14)); continueBtn.setStyle("-fx-background-color: #e94560; -fx-text-fill: white; -fx-padding: 10 20; -fx-background-radius: 5;"); continueBtn.setOnAction(e -> primaryStage.setScene(choiceScene)); buttonBox.getChildren().add(continueBtn); // 添加所有元素到根布局 root.getChildren().addAll(scrollPane, buttonBox); VBox.setVgrow(scrollPane, Priority.ALWAYS); // 设置对话文本 String dialogue = "你是一名南昌航空大学的学生,今晚你将迎来一个重要的抉择。\n\n" + "明天有一场重要的考试,但你已经疲惫不堪。\n\n" + "与此同时,你的游戏好友邀请你参加一场重要的团队比赛。\n\n" + "你将如何选择?"; dialogueText.setText(dialogue); startScene = new Scene(root, 800, 600); } // 初始化选择场景 private void initChoiceScene() { // 创建背景 VBox root = new VBox(); root.setPrefSize(800, 600); root.setStyle("-fx-background-color: #1a1a2e;"); // 标题 Label titleLabel = new Label("你的选择是..."); titleLabel.setFont(Font.font("SimHei", FontWeight.BOLD, 24)); titleLabel.setTextFill(Color.WHITE); titleLabel.setPadding(new Insets(20)); // 选项容器 choiceContainer = new VBox(20); choiceContainer.setPadding(new Insets(20, 100, 20, 100)); choiceContainer.setAlignment(Pos.CENTER); // 创建选项 CheckBox choose1 = new CheckBox("睡觉"); CheckBox choose2 = new CheckBox("学习"); CheckBox choose3 = new CheckBox("玩游戏"); // 配置选项样式 configureCheckBox(choose1); configureCheckBox(choose2); configureCheckBox(choose3); // 添加到列表 checkBoxes.add(choose1); checkBoxes.add(choose2); checkBoxes.add(choose3); // 添加到容器 choiceContainer.getChildren().addAll(choose1, choose2, choose3); // 提交按钮 Button submitBtn = new Button("提交选择"); submitBtn.setFont(Font.font("SimHei", FontWeight.BOLD, 16)); submitBtn.setStyle("-fx-background-color: #e94560; -fx-text-fill: white; -fx-padding: 10 30; -fx-background-radius: 5;"); submitBtn.setOnAction(event -> handleChoiceSelection()); // 按钮容器 HBox buttonBox = new HBox(submitBtn); buttonBox.setAlignment(Pos.CENTER); buttonBox.setPadding(new Insets(20)); // 添加所有元素到根布局 root.getChildren().addAll(titleLabel, choiceContainer, buttonBox); VBox.setVgrow(choiceContainer, Priority.ALWAYS); choiceScene = new Scene(root, 800, 600); } // 配置CheckBox样式 private void configureCheckBox(CheckBox checkBox) { checkBox.setFont(Font.font("SimHei", FontWeight.NORMAL, 18)); checkBox.setTextFill(Color.WHITE); checkBox.setStyle("-fx-padding: 10;"); // 自定义CheckBox样式 checkBox.setStyle( "-fx-font-family: 'SimHei'; " + "-fx-font-size: 18px; " + "-fx-text-fill: white; " + "-fx-padding: 10px; " + "-fx-mark-color: #e94560; " + "-fx-box-border: transparent; " + "-fx-background-color: rgba(0, 0, 0, 0.4); " + "-fx-background-radius: 5px; " + "-fx-padding: 5px 10px; " ); // 悬停效果 checkBox.hoverProperty().addListener((observable, oldValue, newValue) -> { if (newValue) { checkBox.setStyle( "-fx-font-family: 'SimHei'; " + "-fx-font-size: 18px; " + "-fx-text-fill: #e94560; " + "-fx-padding: 10px; " + "-fx-mark-color: #e94560; " + "-fx-box-border: transparent; " + "-fx-background-color: rgba(0, 0, 0, 0.6); " + "-fx-background-radius: 5px; " + "-fx-padding: 5px 10px; " ); } else { checkBox.setStyle( "-fx-font-family: 'SimHei'; " + "-fx-font-size: 18px; " + "-fx-text-fill: white; " + "-fx-padding: 10px; " + "-fx-mark-color: #e94560; " + "-fx-box-border: transparent; " + "-fx-background-color: rgba(0, 0, 0, 0.4); " + "-fx-background-radius: 5px; " + "-fx-padding: 5px 10px; " ); } }); } // 处理选项选择 private void handleChoiceSelection() { long selectedCount = checkBoxes.stream().filter(CheckBox::isSelected).count(); if (selectedCount == 3) { // 显示警告对话框 showWarningDialog(); } else { // 确定结局 determineEnding(); } } // 显示警告对话框 private void showWarningDialog() { // 创建对话框 VBox dialogBox = new VBox(20); dialogBox.setPrefSize(600, 300); dialogBox.setPadding(new Insets(20)); dialogBox.setAlignment(Pos.CENTER); dialogBox.setStyle("-fx-background-color: #16213e; -fx-background-radius: 10; -fx-border-color: #e94560; -fx-border-width: 2; -fx-border-radius: 10;"); // 警告信息 Label warningLabel = new Label("做不到喵!"); warningLabel.setFont(Font.font("SimHei", FontWeight.BOLD, 20)); warningLabel.setTextFill(Color.RED); // 选项按钮 HBox buttonBox = new HBox(20); buttonBox.setAlignment(Pos.CENTER); Button option1Btn = new Button("1. 重新选择"); option1Btn.setFont(Font.font("SimHei", FontWeight.BOLD, 14)); option1Btn.setStyle("-fx-background-color: #e94560; -fx-text-fill: white; -fx-padding: 8 15; -fx-background-radius: 5;"); option1Btn.setOnAction(e -> { // 清除所有选择 checkBoxes.forEach(cb -> cb.setSelected(false)); primaryStage.setScene(choiceScene); }); Button option2Btn = new Button("2. 坚持选择"); option2Btn.setFont(Font.font("SimHei", FontWeight.BOLD, 14)); option2Btn.setStyle("-fx-background-color: #e94560; -fx-text-fill: white; -fx-padding: 8 15; -fx-background-radius: 5;"); option2Btn.setOnAction(e -> { // 显示白日梦想家结局 resultLabel.setText("达成结局——白日梦想家"); primaryStage.setScene(resultScene); }); buttonBox.getChildren().addAll(option1Btn, option2Btn); dialogBox.getChildren().addAll(warningLabel, buttonBox); // 创建场景 Scene dialogScene = new Scene(dialogBox, 400, 200); primaryStage.setScene(dialogScene); } // 确定结局 private void determineEnding() { boolean sleepSelected = checkBoxes.get(0).isSelected(); boolean studySelected = checkBoxes.get(1).isSelected(); boolean gameSelected = checkBoxes.get(2).isSelected(); String ending = ""; if (sleepSelected && studySelected && !gameSelected) { ending = "达成结局——传统好学生"; } else if (sleepSelected && gameSelected && !studySelected) { ending = "达成结局——摆烂先锋者"; } else if (studySelected && gameSelected && !sleepSelected) { ending = "达成结局——令人唏嘘的猝死者"; } else { // 默认结局 ending = "达成结局——未知选择者"; } resultLabel.setText(ending); primaryStage.setScene(resultScene); } // 初始化结局场景 private void initResultScene() { // 创建背景 VBox root = new VBox(); root.setPrefSize(800, 600); root.setStyle("-fx-background-color: #1a1a2e;"); // 结局标题 Label titleLabel = new Label("结局"); titleLabel.setFont(Font.font("SimHei", FontWeight.BOLD, 36)); titleLabel.setTextFill(Color.WHITE); titleLabel.setPadding(new Insets(40, 0, 20, 0)); // 结局内容 resultLabel = new Label(""); resultLabel.setFont(Font.font("SimHei", FontWeight.BOLD, 24)); resultLabel.setTextFill(Color.WHITE); resultLabel.setPadding(new Insets(20)); resultLabel.setWrapText(true); resultLabel.setAlignment(Pos.CENTER); // 重新开始按钮 Button restartBtn = new Button("重新开始"); restartBtn.setFont(Font.font("SimHei", FontWeight.BOLD, 16)); restartBtn.setStyle("-fx-background-color: #e94560; -fx-text-fill: white; -fx-padding: 10 30; -fx-background-radius: 5;"); restartBtn.setOnAction(e -> { // 清除所有选择 checkBoxes.forEach(cb -> cb.setSelected(false)); primaryStage.setScene(startScene); }); // 按钮容器 HBox buttonBox = new HBox(restartBtn); buttonBox.setAlignment(Pos.CENTER); buttonBox.setPadding(new Insets(40)); // 添加所有元素到根布局 root.getChildren().addAll(titleLabel, resultLabel, buttonBox); VBox.setVgrow(resultLabel, Priority.ALWAYS); resultScene = new Scene(root, 800, 600); } public static void main(String[] args) { launch(args); } }
不足
感觉自己在JavaFX上学的不够扎实,目前仅仅会用一些基本的组件,但更深入的知识了解基本为0(悲),但感觉JavaFX功能特别强大,也很好用,对于做界面是一项利器,未来工作中坑定也会时常用到,所以这方面以后还需要沉下心来探索学习。
印象最深的题
7-4
NCHU_统计Java程序中关键词的出现次数
编写程序统计一个输入的Java源码中关键字(区分大小写)出现的次数。说明如下:
Java中共有53个关键字
从键盘输入一段源码,统计这段源码中出现的关键字的数量
- 注释中出现的关键字不用统计
- 字符串中出现的关键字不用统计
- 统计出的关键字及数量按照关键字升序进行排序输出
- 未输入源码则认为输入非法
输入格式:
输入Java源码字符串,可以一行或多行,以exit行作为结束标志
输出格式:
当未输入源码时,程序输出Wrong Format
当没有统计数据时,输出为空
当有统计数据时,关键字按照升序排列,每行输出一个关键字及数量,格式为数量\t关键字
输入样例:
在这里给出一组输入。例如:
//Test public method public HashMap(int initialCapacity) { this(initialCapacity, DEFAULT_LOAD_FACTOR); } public HashMap(int initialCapacity, float loadFactor) { if (initialCapacity < 0) throw new IllegalArgumentException("Illegal initial capacity: " + initialCapacity); if (initialCapacity > MAXIMUM_CAPACITY) initialCapacity = MAXIMUM_CAPACITY; if (loadFactor <= 0 || Float.isNaN(loadFactor)) throw new IllegalArgumentException("Illegal load factor: " + loadFactor); this.loadFactor = loadFactor; this.threshold = tableSizeFor(initialCapacity); } exit
输出样例:
在这里给出相应的输出。例如:
1 float
3 if
2 int
2 new
2 public
3 this
2 throw
1. 关键字集合的初始化
- 实现方式:
- 使用静态字符串数组
keyWord存储所有 Java 关键字(如abstract、if、class等)。 - 通过
TreeMap<String, Integer>记录每个关键字的出现次数,TreeMap自动按字典序排序。
- 使用静态字符串数组
- 关键点:
- 关键字列表覆盖了 Java 的保留字(包括现代版本新增的
var、yield等)。 TreeMap的排序特性便于最终结果按字母顺序输出。
- 关键字列表覆盖了 Java 的保留字(包括现代版本新增的
2. 源码的读取与处理
- 实现方式:
- 通过
Scanner逐行读取用户输入,直到遇到exit或输入结束。 - 检查输入是否为空(
isVacant标志),若为空则抛出IllegalArgumentException。
- 通过
- 关键点:
- 支持多行输入,适合粘贴完整代码片段。
- 输入终止条件明确(
exit或文件结束符)。
3. 源码的预处理
- 实现方式:
- 注释处理:
CommentProcessor类负责过滤注释:- 识别并跳过块注释(
/* ... */)和行注释(//)。 - 忽略字符串内的内容(避免将
"int"误判为关键字)。
- 识别并跳过块注释(
- 单词提取:
extractWords方法遍历预处理后的代码,按非字母字符(如空格、括号)分割单词。
- 注释处理:
- 关键点:
- 注释处理逻辑严谨,避免误判(如
/* int */中的int不会被统计)。 - 字符串内的关键字被忽略(如
String s = "for";中的for不计入统计)。
- 注释处理逻辑严谨,避免误判(如
4. 关键字的统计
- 实现方式:
- 对每个提取的单词,检查是否存在于
keyWord数组中。 - 若匹配,则更新
TreeMap中对应关键字的计数器(getOrDefault确保初始值为 0)。
- 对每个提取的单词,检查是否存在于
- 关键点:
- 使用
equals进行精确匹配(区分大小写,Java 关键字全为小写)。 - 统计结果通过
writeResults方法按次数\t关键字格式输出,如3\tif
- 使用
源代码:
import java.util.Map; import java.util.Scanner; import java.util.TreeMap; public class Main { public static void main(String[] args) { JavaKeywordCounter counter = new JavaKeywordCounter(); try { counter.countKeyWord(new Scanner(System.in)); counter.writeResults(); } catch (IllegalArgumentException e) { System.out.println("Wrong Format"); } } } class JavaKeywordCounter { //关键字数组创建 private static final String[] keyWord = { "abstract" ,"assert" ,"boolean" ,"break", "byte", "case" ,"catch" ,"char", "class", "const", "continue" ,"default" ,"do", "double" ,"else", "enum" ,"extends", "final" ,"finally" ,"float", "for" ,"goto", "if" ,"implements", "import", "instanceof", "int" ,"interface" ,"long" ,"native" ,"new", "package", "private" ,"protected", "public", "return", "short" ,"static" ,"strictfp", "super" ,"switch", "synchronized", "this" ,"throw" ,"throws" ,"transient", "try" ,"void", "volatile", "while" ,"record", "sealed", "non-sealed", "permits", "var", "yield" }; private final Map<String, Integer> keywordNumber = new TreeMap<>(); private final CommentProcessor commentProcessor = new CommentProcessor(); public void countKeyWord(Scanner scanner) { StringBuilder cleanCode = new StringBuilder(); boolean isVacant = true; // 先逐行读取代码检查是否输入为空 while (scanner.hasNextLine()) { String line = scanner.nextLine(); if (line.equals("exit")) break; isVacant = false; cleanCode.append(commentProcessor.cleanLine(line)).append("\n"); } if (isVacant) { throw new IllegalArgumentException("Wrong Format"); } extractWords(cleanCode.toString()); } private void extractWords(String code) { StringBuilder currentWord = new StringBuilder(); boolean inWord = false; for (int i = 0; i < code.length(); i++) { char c = code.charAt(i); if (Character.isLetter(c)) { currentWord.append(c); inWord = true; } else { if (inWord) { countKeyword(currentWord.toString()); currentWord.setLength(0); inWord = false; } // 有括号的情况 if (c == '(' || c == ')') { // 保留原始注释 } } } // 处理最后一个单词 if (inWord) { countKeyword(currentWord.toString()); } } private void countKeyword(String word) { for (String keyword : keyWord) { if (keyword.equals(word)) { keywordNumber.put(word, keywordNumber.getOrDefault(word, 0) + 1); break; } } } public void writeResults() { for (Map.Entry<String, Integer> entry : keywordNumber.entrySet()) { System.out.println(entry.getValue() + "\t" + entry.getKey()); } } } class CommentProcessor { private boolean inBlockComment = false; public String cleanLine(String line) { StringBuilder cleaned = new StringBuilder(); boolean inString = false; boolean inLineComment = false; for (int i = 0; i < line.length(); i++) { char c = line.charAt(i); // 处理块注释开始 if (!inString && !inBlockComment && !inLineComment && c == '/' && i+1 < line.length() && line.charAt(i+1) == '*') { inBlockComment = true; i++; // 跳过'*' continue; } // 处理块注释结束 if (inBlockComment && c == '*' && i+1 < line.length() && line.charAt(i+1) == '/') { inBlockComment = false; i++; // 跳过'/' continue; } // 处理行注释 if (!inString && !inBlockComment && !inLineComment && c == '/' && i+1 < line.length() && line.charAt(i+1) == '/') { inLineComment = true; i++; // 跳过第二个'/' continue; } // 处理字符串 if (!inBlockComment && !inLineComment && c == '"') { inString = !inString; continue; } // 只添加非注释、非字符串内容 if (!inBlockComment && !inLineComment && !inString) { cleaned.append(c); } } return cleaned.toString(); } }
三采坑心得
在学习java的过程中,也走了不少弯路,总结了一些自己的经验教训。
l 课前预习真的很重要,最开始讲类与类之间的关系的时候因为没去听线上课那节课坐了一节课的飞机,已老实下回不敢了。。。
l 编写代码一定要养成写注释的习惯,写电梯的时候因为没啥注释第二天看自己的代码像在看天书谁懂
l 编写程序前要先设计好基本结构,不能再像上个学期一样拿到题目啥也没想就敢敲代码,一定要先把要设计哪些类,类与类之间是什么关系,继承抽象和接口应该用哪个,这样设计之后方不方便复用,是否符合七大原则全部想好再进行代码的编写,不然后期发现要大改的时候真的会碎掉。
四,改进建议及总结
总的来说,面象对象程序设计这门课程难易结合,线上线下紧密结合,让我收获颇多。我完成了从C语言的“面向过程”到java的“面向对象”的思维转变,掌握了封装、继承、多态等核心特性,并能够独立开发一个小型的JavaFX应用(航空货运系统)。课程中的PTA作业与实验项目锻炼了我的编码能力与问题解决能力,而踩坑经历则让我深刻理解了“代码质量”和严谨性的重要。
这学期也让我充分意识到编程需要耐心和毅力,半途而废只会一事无成。在未来的学习中,我会保持更加热情,积极的态度投入软件工程的学习。

浙公网安备 33010602011771号