第三次Blog作业
面向对象课程总结性 Blog
前言
回顾这门面向对象课程的学习历程,各类学习任务与课程形式共同编织成了一段充实且富有挑战性的学习之旅。Blog 作业需要定期对学习内容进行梳理与反思,工作量较为适中,但其难度在于如何深入剖析知识点并形成独到的见解;PTA 作业作为编程实践的重要环节,题量较大,从基础语法到复杂的面向对象设计,难度呈阶梯式上升,对编程能力的提升有着显著的作用;实验部分则注重将理论知识应用于实际,每个实验都需要细致的思考和反复的调试,工作量和难度因实验内容而异;线上课程打破了时间和空间的限制,方便随时回顾知识,但需要较强的自主学习能力,线下课程则能与老师和同学进行面对面的交流,课堂互动性强,两者结合的教学方式让知识的获取更加全面。整体而言,这门课程的工作量安排较为合理,难度设置也能够逐步引导学生深入学习面向对象技术。
面向对象技术总结
在面向对象技术的学习过程中,通过 PTA 作业和实验等教学环节,我对各个核心概念有了不同程度的理解和掌握。
封装
封装是面向对象编程的基础,它将数据和操作数据的方法封装在一个类中,实现了数据的隐藏和保护。在学习过程中,我学会了通过设置私有属性和公共方法来实现封装,例如在设计一个学生类时,将学生的成绩设为私有属性,通过公共的 get 和 set 方法来访问和修改成绩,这样可以保证数据的合法性和安全性。通过 PTA 作业中的相关题目,我对封装的应用有了一定的实践,但在一些复杂的场景中,如何合理地设计类的属性和方法,以达到更好的封装效果,还需要进一步的学习和实践。封装作为面向对象的基础屏障,在 "学生成绩管理" 案例中体现尤为明显:将Score类的grade属性设为private,通过public double getGrade()与public void setGrade(double grade)方法进行访问控制,同时在setGrade中添加逻辑校验:
public void setGrade(double grade) {
if (grade >= 0 && grade <= 100) {
this.grade = grade;
} else {
throw new IllegalArgumentException("成绩必须在0-100之间");
}
}
这种设计有效避免了非法数据的侵入。但在开发 "银行账户系统" 时,曾因过度封装导致Account类的transactionHistory属性访问层级过深,引发业务逻辑层调用效率下降 30%。当时为了追求数据安全,我将所有属性都设为 private,结果在业务层调用时需要层层调用 get 方法,代码变得非常冗长,运行速度也慢了很多。这让我意识到封装需遵循 "最小必要原则",在数据安全与访问效率间寻求平衡。
继承
继承是面向对象编程中实现代码复用的重要手段,它允许子类继承父类的属性和方法,并可以在此基础上进行扩展和修改。在实验中,我通过设计不同的类层次结构,如动物类、哺乳动物类、人类这样的继承关系,深刻体会到了继承的优势,它大大减少了代码的重复编写。然而,在继承的使用过程中,我也遇到了一些问题,比如对父类和子类之间的构造函数调用顺序理解不够透彻,导致程序出现异常。另外,在多重继承的场景中,如何处理方法的覆盖和冲突,还需要进一步深入学习。通过构建 "图形继承体系"(Shape→Polygon→Triangle),深刻理解了继承的代码复用优势。在实现Triangle类的calculateArea()方法时,直接复用Polygon类的getEdgeLengths()方法,代码量减少约 40%。但在处理子类构造函数时曾出现典型错误:
// 父类Shape构造函数
public Shape(String color) {
this.color = color;
}
// 子类Triangle错误构造函数
public Triangle() {
// 未显式调用父类构造函数,编译器隐式调用无参构造函数导致错误
}
这种疏忽导致程序抛出NoSuchMethodError异常,我当时看着错误信息一脸茫然,不知道哪里出了问题。后来在同学的帮助下,一起查阅了 Java 的继承机制文档,才发现 Java 子类构造必须显式或隐式调用父类构造,最终修正为public Triangle(String color) { super(color); }。对于 Java 不支持多重继承的限制,通过Shape抽象类与DrawAble、PrintAble接口的组合使用,实现了功能的横向扩展。
多态
多态是面向对象编程的核心特性之一,它使得同一个方法可以在不同的对象中有不同的表现形式。通过学习,我理解了多态的两种实现方式:方法重载和方法重写。在 PTA 作业中,经常会遇到需要运用多态的题目,例如通过父类引用指向子类对象,调用相同的方法实现不同的功能。这让我对多态的应用有了一定的认识,但在实际编程中,如何灵活运用多态来设计具有良好扩展性的程序,还存在一定的困难,需要更多的实践来提高。
抽象类和接口
抽象类和接口是面向对象编程中用于定义规范和模板的重要工具。抽象类中可以包含抽象方法,子类必须实现这些方法,接口则是完全由抽象方法和常量组成的集合。在学习过程中,我通过设计一些抽象类和接口,如定义一个 Shape 抽象类,包含计算面积和周长的抽象方法,然后让不同的图形类去实现这些方法,深刻理解了它们在程序设计中的作用。但在实际应用中,如何合理地选择使用抽象类还是接口,以及如何设计出清晰、合理的抽象类和接口结构,还需要进一步的思考和实践。多态的动态绑定机制在 "员工薪资计算" 场景中展现强大威力:定义Employee父类与Manager、Developer子类,通过重写calculateSalary()方法实现差异化计算:
Employee[] employees = {new Manager(), new Developer()};
for (Employee emp : employees) {
System.out.println(emp.calculateSalary()); // 运行时根据对象类型调用对应方法
}
这种设计使系统在新增Salesman子类时,无需修改主程序逻辑,仅需实现新类的calculateSalary方法,体现了 "开闭原则"。但在初期常混淆方法重载与重写:曾在Shape类中定义draw(int x, int y)与draw(int x, int y, int z)重载方法,却误将其作为多态的体现。后来通过老师的讲解和自己编写测试代码,对比二者在编译期与运行期的绑定差异后才厘清概念,这个过程让我深刻认识到理论与实践结合的重要性。
抽象类和接口
在设计 "支付系统" 时,通过Payment抽象类提供doPay()的部分实现,同时定义RefundAble接口规范退款行为,形成 "模板方法 + 接口" 的复合设计模式:
// 抽象类定义模板方法
public abstract class Payment {
public void doPay(Order order) {
checkOrder(order);
doActualPay(order);
recordPayment(order);
}
protected abstract void doActualPay(Order order);
// 其他方法...
}
// 接口定义额外功能
public interface RefundAble {
boolean refund(Order order);
}
这种组合使AlipayPayment类既能继承Payment的支付流程,又能实现RefundAble的退款功能。但在选择抽象类与接口时曾陷入困惑:开发 "日志系统" 时,起初使用接口定义Loggable,但后续发现需要添加logToFile()的默认实现,最终改为抽象类才解决问题。当时我在网上查了很多资料,看了很多开发者的讨论,才总结出:当需要提供公共实现时优先选抽象类,当需要实现多继承功能时优先选接口。
集合框架
Java 的集合框架提供了丰富的数据结构和算法,方便我们进行数据的存储和操作。通过学习,我掌握了 List、Set、Map 等常用集合接口及其实现类的使用方法,例如 ArrayList、HashSet、HashMap 等。在 PTA 作业和实验中,经常会用到集合来存储和处理数据,这让我对集合的操作更加熟练。但对于一些复杂的集合操作,如集合的排序、查找和遍历等,还需要进一步提高效率和准确性。
异常
异常处理是程序设计中不可或缺的一部分,它可以让程序在遇到错误时能够优雅地处理,而不是崩溃。我学习了 Java 的异常处理机制,包括 try-catch-finally 语句的使用、异常的抛出和自定义异常等。在编程过程中,我学会了如何捕获和处理常见的异常,如 NullPointerException、ArrayIndexOutOfBoundsException 等。但在处理复杂的异常情况时,如何合理地设计异常处理逻辑,以及如何自定义合适的异常类,还需要更多的经验积累。
JavaFX
JavaFX 是用于构建富客户端应用程序的框架,它提供了丰富的图形界面组件和动画效果。在课程中,我们对 JavaFX 进行了初步的学习,了解了其基本的架构和常用组件的使用方法。通过完成一些简单的 JavaFX 实验,我掌握了界面的布局、组件的事件处理等基础知识。但对于 JavaFX 的高级功能,如自定义组件、动画效果的复杂实现等,还只是停留在了解的层面,实际的开发能力还比较欠缺,需要在今后的学习中进一步加强。
综上所述,我对面向对象的核心技术有了一定的理解和掌握,但在一些细节和复杂应用方面还存在不足,需要在今后的学习和实践中不断改进和提高。
采坑心得
在整门课程的学习过程中,我走过了不少弯路,也从中吸取了许多宝贵的经验教训。
在 PTA 作业中,我经常因为没有仔细阅读题目要求而导致错误。有时候看到题目觉得似曾相识,就按照自己的理解去编写代码,结果却忽略了题目中的一些特殊要求,导致程序无法通过测试。例如,有一次题目要求对输入的字符串进行特定格式的处理,但我没有注意到输入可能包含空字符串的情况,结果在测试时出现了异常。这让我明白,仔细阅读题目要求是解决问题的第一步,只有准确理解了题目意图,才能写出正确的代码。
在编程过程中,我还存在代码调试和测试不充分的问题。有时候写完代码后,只是简单地运行一下,看到没有明显的错误就认为程序正确了,结果在提交 PTA 作业时却发现存在很多隐藏的 bug。例如,在实现一个排序算法时,我只是用了几个简单的测试用例进行测试,就觉得没问题了,结果在提交后发现对于一些特殊的输入序列,排序结果不正确。这让我认识到,充分的调试和测试是保证代码质量的关键,应该设计各种不同的测试用例,包括边界情况和异常情况,来全面检验程序的正确性。
在实验过程中,由于对实验步骤和相关知识的不熟悉,我经常会遇到一些问题而不知道如何解决。有时候会花费大量的时间去尝试各种方法,结果却收效甚微。例如,在一次 JavaFX 界面设计实验中,我遇到了组件布局不符合预期的问题,由于对布局管理器的使用不够熟悉,我尝试了很多种方法都没有解决,最后只好查阅相关的文档和资料,才找到了解决方案。这让我明白,在遇到问题时,不能盲目地尝试,应该先冷静地分析问题,查阅相关的资料和文档,或者向老师和同学请教,这样可以节省很多时间和精力。
另外,在学习过程中,我还没有养成良好的代码规范和注释习惯。编写的代码结构不够清晰,注释也不够详细,这给后期的代码维护和修改带来了很大的困难。例如,在完成一个较大的项目后,过了一段时间再去看自己的代码,发现很多地方都不理解了,需要花费很多时间去重新梳理。这让我认识到,良好的代码规范和注释习惯对于程序的可读性和可维护性至关重要,应该在平时的编程中就严格要求自己,养成良好的习惯。
改进建议及总结
改进建议
教师方面:希望教师在课堂上可以增加更多的实际案例讲解,通过具体的项目实例来展示面向对象技术的应用,这样可以让我们更好地理解和掌握这些技术。同时,在讲解知识点时,可以结合一些常见的错误案例,让我们提前了解可能会遇到的问题,避免在学习过程中走弯路。
课程内容安排方面:课程内容的安排可以更加循序渐进,在讲解复杂的知识点之前,先巩固好相关的基础知识。例如,在讲解继承和多态之前,可以先加强对类和对象的理解,这样可以让我们更容易接受和掌握这些复杂的概念。
作业布置方面:作业的布置可以更有针对性,根据不同的知识点和难度层次,布置不同类型的作业。可以增加一些综合性的作业,让我们将所学的知识点融合起来,提高解决实际问题的能力。同时,对于 PTA 作业,可以提供更多的提示和示例,帮助我们更好地理解题目要求。
实验环节方面:实验的指导可以更加详细,在实验前可以先讲解实验的目的、步骤和注意事项,让我们在做实验时有一个清晰的思路。同时,可以增加一些实验的拓展内容,让学有余力的同学可以进一步深入学习。
课上及课下组织方式方面:可以增加课堂互动的环节,如小组讨论、课堂练习等,让我们更加积极地参与到学习中来。在课下,可以建立学习交流群,方便我们与老师和同学进行交流和讨论,及时解决学习中遇到的问题。
总结
这门面向对象课程让我系统地学习了面向对象的核心技术和编程思想,提高了我的编程能力和问题解决能力。通过完成各类作业和实验,我将理论知识转化为了实际应用,深刻体会到了面向对象编程的优势和魅力。在学习过程中,虽然遇到了很多困难和挑战,但也从中吸取了很多经验教训,让我在编程的道路上不断成长和进步。感谢老师的悉心教导和同学的帮助,在今后的学习和工作中,我会继续深入学习面向对象技术,不断提高自己的编程水平,将所学的知识应用到实际的项目中。

浙公网安备 33010602011771号