面向对象课程第三阶段作业总结

一. 前言
经过长达一学期的学期,面向对象课程也接近尾声了,从java的基础语法学习,再将初识面向对象思想,后逐渐理解面向对象,最后将他与面向过程彻底分开,在我的脑海中形成一个单独的概念。其实不经感慨计算机行业的前辈的认知超群,创建了这种与从小教育体系完全不一样的思考方式,但这也正是现代工业管理思想的核心,所以面向对象的学习,不单单是编程技术上的学习,更是对现代工业文明的一种近距离接触,实操了什么是工业化,将名词动词化了。

二. 面向对象核心技术总结

  1. ​封装
    大白话理解:​封装就是把数据和操作数据的细节打包藏起来(封),只留几个安全可靠的“小门”(方法)让外面的人按规矩办事(装)。这样东西(数据)更安全,用起来也更简单、更灵活、更好维护。​
    比如这个题

    藏起来就是把他放在一个类中,同时用private将数据隐藏起来,不让数据轻易被改变,例如:id:账号,整数类型,默认0;balance:余额,浮点数类型,默认0。小门就是get,set方法,外面可以用这些方法,同时也可以根据这些小门来办事,来对变量进行操作,例如:getMonthlyInterestRate方法:是静态方法,但需要传入两个参数(a和b)实际上可以直接用类的balance和annualInterestRate成员变量来计算;withDraw方法:是静态方法,但需要传入余额a和取款金额b。

四大关系
当然封装后还有四种类鱼类直接的关系,分别是依赖,关联,聚合,组合
可以简单的理解成下面四句话
依赖​:临时借东西,用完就还。你去图书馆临时借一支笔写作业,用完就还回去。笔不是你自己的,你只是“暂时用一下”。
​关联​:长期合作,但不一定属于我。学生和学校是长期合作关系,学生长期记住学校的地址​(成员变量保存学校的引用),但学校不属于学生。
​聚合​:整体和部分,可以分开(比如班级和学生)。班级和学生是聚合关系:学生是班级的“部分”,但学生可以独立存在​(比如转学后还是学生)。
​组合​:整体和部分,同生共死(比如人和心脏)。人和心脏是组合关系:心脏是人的“部分”,​心脏不能独立于人存在​(心脏离开人就没法活)。

  1. 继承
    简单说就是,老大​(父类):已经写好了一本作业本,里面有数学、语文、英语三科答案。老二​(子类):不想从头写作业,直接把老大的作业本抄过来,但老二更聪明——他可以:1.直接用老大写好的答案(比如数学题)。2.修改部分答案(比如把语文作文重写一遍)。3.新增自己的答案(比如加一本科幻题目)。这就是继承:​子类直接复用父类的功能,还能按需修改或扩展。
    例如下面的UML图

    以下是对这道题继承关系的总结:
    整体继承体系
    本题构建了一个基于图形绘制的简单继承体系。最顶层是抽象类 Element,它作为所有图形元素的基类,定义了图形共有的属性 color(颜色)以及抽象方法 display(),强制要求子类去实现具体的显示逻辑。Line 类和 Plane 类继承自 Element 类,它们是具体的图形类,分别代表直线和平面这两种不同的图形元素。

子类对父类的继承与扩展
​Line 类​:继承了 Element 类的 color 属性,同时新增了两个 Point 类型的属性 point1 和 point2 用于表示直线的两个端点。它通过构造函数接收这两个端点以及颜色信息来完成初始化。在方法上,除了继承父类的 display() 方法(需重写)外,还定义了一系列针对端点和颜色的操作方法,比如获取和设置端点的横纵坐标以及颜色等。
​Plane 类​:相对简单一些,它继承了 Element 类的 color 属性,并重写了 display() 方法以展示平面相关的绘制逻辑。此外,它还额外提供了一个 setColor 方法,用于修改平面的颜色,并且在设置颜色时将输入的颜色字符串转换为大写形式,增加了对颜色数据的处理逻辑。

  1. ​抽象
    抽象正如其名,就是把完整的变成不完整的。说白了就是抽象就是“抓住重点,忽略细节”。
    还是下面的UML图

    从整体架构来看,Element 是一个抽象类,它充当了整个图形体系的基石。它抽象出了所有图形元素共有的特性——颜色(color),并以属性的形式进行定义。同时,Element 定义了一个抽象方法 display(),这其实是对所有图形元素共性行为的一种抽象概括,即每个图形都需要有显示自身的操作,但具体如何显示则交由具体的子类去实现。

Line 类作为 Element 的子类,继承了父类的 color 属性,这体现了代码复用的特性,避免了在每个具体图形类中重复编写颜色相关代码。此外,Line 类还有自己独特的属性 point1 和 point2 来表示直线的两个端点,并且实现了 display() 方法,以符合直线显示的逻辑,同时还有针对自身属性的一系列操作方法。

Plane 类同样继承自 Element,继承了颜色属性并重写了 display() 方法来展示平面的绘制逻辑,还额外提供了 setColor 方法对颜色进行处理。

  1. 接口​
    接口就像“充电口的标准”​——它只规定“必须有什么功能”(比如充电口必须有正负极),但不管具体怎么实现​(比如安卓充电口和苹果充电口内部结构完全不同)。

    首先是 Drawable 接口,它规定了所有图形必须实现 draw() 方法。这一接口就像是一个契约,确保了无论是圆形、矩形还是未来可能添加的其他图形,都具备绘制自身的能力。通过这种约束,使得在调用图形的绘制操作时,可以统一地对待不同类型的图形,提高了代码的可扩展性和灵活性。

其次是 Element 抽象类,它作为所有图形的基类,包含了公共属性 color(颜色),这使得所有图形都可以拥有颜色这一属性。同时,它定义了抽象方法 display(),要求子类必须实现该方法来显示图形信息。这种设计将图形共有的属性和行为进行了抽象,避免了在每个具体图形类中重复编写相同的代码,实现了代码的复用。

与抽象的关系思考
在图形绘制系统里,接口和抽象类就像两个配合默契的好队友,一个负责"扩展能力",一个负责"沉淀共性",配合起来简直完美!
先说说接口的扩展能力。我们设计的Drawable接口简直是个"万能通行证"!它只规定了一个必须实现的方法draw(),这就意味着:不管是圆形、矩形还是以后可能新增的三角形、五角星,只要想成为"可绘制图形",就必须实现这个draw()方法。最棒的是,当我们需要新增图形类型时(比如添加Triangle类),完全不需要改动现有的代码!只需要让新类实现Drawable接口就可以了。这种设计简直太灵活了,完全符合编程里的"开闭原则"——对扩展开放,对修改关闭!
再来看看抽象类的共性沉淀。Element抽象类就像是一个"图形模板",它帮我们把所有图形都有的共同点都封装好了:
所有图形都有color属性(颜色)
所有图形都需要实现display()方法(显示图形信息)
这样一来,Circle和Rectangle这些具体图形类就不用重复编写这些共性代码了!它们只需要:
继承Element类,自动获得color属性和display()方法框架
专注实现自己特有的属性和逻辑(比如Circle要处理radius半径,Rectangle要处理width和height)
这种分工简直太合理了!接口负责定义"能做什么"(行为规范),抽象类负责提供"有什么"(属性)和"基础怎么做"(部分实现)。它们俩配合起来,让我们的代码既灵活又高效,新增图形类型时特别方便,而且完全不用担心会影响到已有的代码。

  1. List等工具类

    List的特点总结​
    ​按顺序存取​:数据有编号(从0开始),可以通过编号快速找到对应的数据。(适用于ArrayList)
    ​允许重复​:可以放多个相同的数据(比如购物清单上写多个"牛奶")。(适用于LinkedList
    ​动态大小​:不需要提前规定能存多少数据,需要多少就存多少(不像数组固定长度)。(优于数组,所以list用的多)

重点:Collection类中的Comparable
Comparable是Java中的一个接口,它的作用是给类定义一个默认的排序规则,就像给数据装上了一把"隐形尺子",让数据知道自己应该怎么排大小。
使用:
第一步:让类实现Comparable接口 public class Student implements Comparable<Student> {
第二步:重写compareTo方法​,这是核心步骤!在这个方法里明确"怎么比大小"。比如按年龄从小到大排:```plaintext
@Override
public int compareTo(Student other) {
注意
返回负数​:当前对象比参数对象"小"(比如年龄更小)。
返回0​:两个对象"相等"。
返回正数​:当前对象比参数对象"大"(比如年龄更大)。
第三步:调用Collections.sort()排序​排序时直接调用系统方法,不用管具体规则!

扩展
第二步时也可以转头自己编写排序规则:就是使用
1.第一步:创建Comparator实现类​,定义一个新类,实现Comparator<要排序的类>接口。比如按学生名字排序:public class NameComparator implements Comparator {
2.第二步:重写compare方法​,这是核心步骤!在这个方法里明确"怎么比大小"。比如按名字从A到Z排:
3.第三步:调用Collections.sort()排序​,排序时直接调用系统方法,不用管具体规则!
总结:Comparable​:数据类自己定义默认排序规则("我天生就知道怎么排")。
​Comparator​:临时定义排序规则("临时需要一种新排法"),不需要改原类。

  1. javaFx
    JavaFX 是 Java 里用来做「好看软件界面」的工具,就像你手机里的 APP 界面、电脑上的 QQ 或文档软件的界面,都可以用它来做。以前用 Java 做界面可能比较丑(比如老的 Swing),JavaFX 能做出更漂亮的界面——支持渐变、圆角、动画,甚至还能放音乐、视频。而且它能把界面设计和代码逻辑分开(比如用类似 HTML 的 FXML 文件存界面,用 Java 存功能),写代码时不会乱成一团。所以javafx的内容及其多且全面,我们对于javaf都只是大概学习,并未深入探究。
    但在学习中依旧发现他可以作为很多很有意思,例如在学习Slider时我将书上的例题改编,

改编成了一个简单的p图软件

1.程序的核心是让 ​4 个滑块(Slider)​​ 控制一张图片的颜色和透明度:
​前3个滑块(red、green、blue)​​:分别控制红、绿、蓝三种颜色的强度(范围 0.0~1.0,比如红色滑块拉到 0.5,就是半红)。
​第4个滑块(opacity)​​:控制图片的透明度(0.0 是全透明看不见,1.0 是完全不透明)。
2.滑块动起来,图片跟着变!​​
关键代码是 ​监听器(InvalidationListener)​​:当滑块被拖动时(值变化),监听器会「触发」一段代码:
先用当前滑块的值(红、绿、蓝、透明度)生成一个 Color 颜色对象。
然后用 ColorAdjust 效果,把颜色和透明度「套」在图片上——相当于给图片「加滤镜」,让它变成你调的颜色,同时变透明/不透明。

总结对于前端的使用可能还差一大截,但可以然我们初步体验程序员的快乐。Javafx与软件开发前端息息相关,这次的学习也是对计算机未来就业的方向有了全新的一个体验,虽然初次上手不是非常熟练,但依旧非常快乐自己做出的也显示交互相关的东西,大大的提高了学习计算机相关知识的热情。

三、踩坑经验与优化方向
​1.开发流程问题:前期设计缺失​
这位同学写代码之前可能没有好好规划。就像老师布置作业要求做飞机订票系统,他一开始没想清楚各个类的关系(比如飞机、乘客、订单应该怎么连接),直接上手写代码,结果写到一半发现结构错了,又要全部重来(就像我们班“小明”做航空系统没用继承,后面返工了)。所以正确做法是:写代码前先画个类图或者流程图,把每个类要做什么事情分清楚,一个类只负责一件事(单一职责原则),这样后面写代码就轻松多了。
eg:看清题目要求

2.​代码质量痛点:可读性差​
代码里面有很多if-else套来套去(比如withDraw方法里的条件判断),看起来头晕眼花,而且一句注释都没有。过几天自己都看不懂,更别说别人来改了。老师说这种情况可以用设计模式来优化,比如用“策略模式”代替一堆if-else(就像电梯调度系统判断方向,不同方向用不同策略)。另外,必须写注释!特别是复杂逻辑,比如那个计算月利率的公式,应该说明一下为什么除以1200(其实是年利率除以12个月再除以100,这样就能变成月利率)。
eg:写的太乱且没有标注的si山代码

​3.代码质量痛点:输入输出陷阱​
代码里用了Scanner输入数据,但没有注意到nextInt()、nextDouble()和nextLine()的混用问题。这就像上次我写作业:输入数字后按回车,再用nextLine()会读到空字符串!这是因为回车符没处理掉。解决方案就是全班统一用nextLine()读取所有输入,然后把字符串转成需要的类型(比如Integer.parseInt(sc.nextLine())),这样就躲开这个坑了。

​4.调试效率低下:实验系统缺陷​
学校的在线实验系统特别难用,不能把代码复制到本地IDE调试(比如用IDEA的单步调试功能)。结果调试只能靠脑子想,打印一堆变量值来看。我们宿舍现在的对策是:先在自己电脑的IDEA里写代码和测试,都调通了再抄一段,让ai检查一段是否不同的往实验系统上交。虽然麻烦点,但比在网页上硬肝快多了!
而且jdk要单独配置,麻烦:

​5.其他问题补充​
这段代码还有些细节问题:比如dateCreated数组没有初始化(报NullPointerException),开户日期该用LocalDate类型却用了数组,取款存款方法没真正改余额... 这些具体问题在之前的分析里都说过了。总之就是要多注意基础啊!
总结:写程序就像盖房子,前期设计最重要。不能拿起砖头就砌墙,结果砌歪了又要拆。另外要多用现代工具(本地IDE)、遵守规范(写注释)、躲开常见坑(Scanner用法),这样才能高效完成作业少熬夜!

四、课程改进建议
1.希望面向对象课程的pta作业增加一些数量,增加中等题数量,减少算法题时间,多用才能更好的理解面向对象思想而且可以提高代码能力,并且激发同学们的学习热情,感觉算法能力培养还是要建立在良好代码能力基础上的,不然又只能和ai协作。
2.希望实验改成更和生活贴切的题目,不让容易误解指导书的要求,大象装冰箱还是不太切实,有点抽象,外卖存储系统,物流存储系统可能更具体点。

最后发自内心的感谢面向对象课程组的所有老师学长,面向对象课程的确教会了我很不一样的思考方式和认知逻辑,希望未来课程越办越好。**

posted @ 2025-06-17 09:35  尉普  阅读(53)  评论(0)    收藏  举报