面向对象程序设计课程总结Blog

一、前言

1.Blog作业我认为是十分重要的,每一次迭代pta大作业后都有一次blog总结作业,可以培养我们学生的自我反思的意识,知道自己能够从每次的练习当中获得怎么样的知识,练习到了什么知识。通过这样的反思过程,我能够更加清晰地认识到自己的学习进度和知识漏洞,从而有针对性地进行后续的学习和巩固。这种自我反思的习惯,不仅有助于提升当下的学习效果,还对我今后的自主学习能力培养有着深远的意义。相比其他需要编程的用脑的作业,这个难度没有那么大,是对自己的反思,也同样重要

2.PTA作业是我们练习编写代码的主要方式,在PTA的布置当中,最开始第一次进入面向对象的时候题目布置的太难,导致刚开始写非常的困难,后面的题目的逻辑我感觉都没有第一次电梯的难度大,这让很多同学都一开始不知道应该从哪来开始弄起。相比之下,后续的题目虽然也有一定难度,但在逻辑复杂度上明显没有第一道电梯题那么高。这就导致很多我们在课程初期因为过高的难度门槛而产生畏难情绪,甚至对后续的学习产生了迷茫和困惑。如果在课程开始阶段,能够提供一些难度梯度更为合理的题目,帮助我们逐步适应面向对象编程的思维方式,或许会取得更好的学习效果。

3.线上的课程安排挺好的可以和线下课程结合然后辅助学生们学习java的知识,但感觉课程所学习的东西不足以支撑我们应对习题的难度,绝大多数时候都还要自己自学。线上课程的安排在一定程度上为我们的学习提供了便利。它与线下课程相辅相成,能够辅助我们更好地学习 Java 知识。线上课程可以让我们在课后随时回顾知识点,弥补课堂上可能遗漏的内容。很多时候,仅仅依靠课程中讲解的内容,无法顺利完成题目要求。这就迫使我们不得不通过自学的方式,查阅大量的资料、参考优秀的代码案例,才能找到解题思路。虽然自学过程能够拓宽我们的知识面,但也在一定程度上增加了学习的压力和难度。

4.整体来说面向对象的课程还是挺好的,让我们了解到面向对象的思想,可以为我们后续的学习打下基础。统地向我们介绍了面向对象的思想,通过类、对象、封装、继承、多态等核心概念的学习,让我们掌握了一种全新的编程思维方式。这种思维方式不仅在 Java 编程中至关重要,也为我们后续学习其他编程语言和开发复杂的软件系统奠定了坚实的基础。

5.实验一共有5次,每一次都是在上一次的基础上进行迭代,增加所学的新的知识点。第一次是java的调试,第二次是类与对象,第三次是继承与多态,第四次是抽象类与接口,第五次的javafx作业。实验内容没有很难,每次实验结束后,都需要写实验报告。通过实验操作和报告,能更深刻掌握当前所学的知识

二、面向对象技术总结

知识点

1.封装是面向对象编程的重要特性之一,它将数据和操作数据的方法进行有机结合,隐藏对象的内部实现细节,仅对外暴露必要的接口。在 Java 中,通过访问修饰符(public、protected、default、private)来实现封装。例如,将类的属性设置为private,外部无法直接访问,只能通过public修饰的getter和setter方法进行访问和修改,这样既能保证数据的安全性,又能在方法中添加数据验证等逻辑。

public class Person {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if (age >= 0) {
            this.age = age;
        }
    }
}

2.类与类之间存在多种关系,主要有关联、依赖、聚合、组合和继承。关联表示类与类之间存在某种联系,比如学生类和课程类之间存在选课的关联关系;依赖关系相对更弱,一个类的实现需要用到另一个类,但二者没有强耦合,如某个工具类在方法中临时使用到另一个类的对象。聚合是一种整体与部分的关系,部分可以脱离整体存在,例如汽车和轮胎,轮胎可以从汽车上拆卸下来;组合也是整体与部分关系,但部分不能脱离整体独立存在,如人和心脏。继承则是子类继承父类的属性和方法,实现代码复用,例如Dog类继承Animal类,Dog类就拥有了Animal类的基本属性和行为 ,同时还能扩展自己特有的方法。​

3.多态指的是同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在 Java 中实现多态需要满足三个条件:继承关系、方法重写、父类引用指向子类对象。例如:

class Shape {
    public void draw() {
        System.out.println("绘制图形");
    }
}

class Circle extends Shape {
    @Override
    public void draw() {
        System.out.println("绘制圆形");
    }
}

class Rectangle extends Shape {
    @Override
    public void draw() {
        System.out.println("绘制矩形");
    }
}

public class Main {
    public static void main(String[] args) {
        Shape shape1 = new Circle();
        Shape shape2 = new Rectangle();
        shape1.draw();
        shape2.draw();
    }
}

在上述代码中,Shape是父类,Circle和Rectangle是子类,通过父类引用调用draw方法时,实际执行的是子类重写后的方法,这就是多态的体现,它提高了代码的扩展性和可维护性。

4.Java 集合框架是一组用于存储和操作数据的类和接口,主要分为Collection和Map两大体系。Collection接口又衍生出List和Set接口。List是有序可重复的集合,ArrayList基于数组实现,查询效率高;LinkedList基于链表实现,插入和删除操作效率高。Set是无序不可重复的集合,HashSet基于哈希表实现,查找速度快;TreeSet基于红黑树实现,元素会自动排序。Map用于存储键值对,HashMap是常用的实现类,具有高效的查询和插入性能;TreeMap会根据键的自然顺序或自定义顺序进行排序。通过泛型机制,集合可以指定元素类型,确保类型安全,并且集合提供了丰富的方法用于数据的增删改查,极大地方便了数据处理。

5.在 Java 中,比较器用于对对象进行排序和比较,主要有Comparable和Comparator两种。Comparable是内部比较器,类实现该接口并实现compareTo(T o)方法,定义对象的自然比较顺序。例如:​

class Student implements Comparable<Student> {
    private int id;

    public Student(int id) {
        this.id = id;
    }

    @Override
    public int compareTo(Student other) {
        return this.id - other.id;
    }
}

Comparator是外部比较器,实现compare(T o1, T o2)方法,可在不修改对象类的情况下,灵活定义不同的比较规则,适用于临时或多种比较需求。比如,对学生按成绩进行排序,就可以通过实现Comparator接口来实现。

掌握情况

相比其他的内容,我对javafx,集合以及比较器掌握的没有那么好。
1。在 JavaFX 中应用该 CSS 样式,只需将 CSS 文件链接到 JavaFX 应用中即可。当鼠标悬停在按钮上时,还可以通过:hover伪类实现动态样式变化,如改变背景颜色、放大按钮尺寸等。​
JavaFX 的动画效果丰富多样,通过Timeline类和各种过渡类(如TranslateTransition平移、RotateTransition旋转、ScaleTransition缩放、FadeTransition淡入淡出)来实现。在电商应用的商品展示页面,使用FadeTransition可以让商品图片在加载完成后逐渐显示,增强用户体验;在游戏界面中,RotateTransition能使游戏角色在移动时产生旋转效果,增加画面的生动性。此外,多个动画可以组合使用,实现复杂的动画序列。例如,在一个欢迎界面中,首先让标题文字从上方逐渐淡入并放大,然后让背景图片从模糊逐渐变清晰,营造出绚丽的视觉效果。
2.集合部分的知识同样让我犯难。List、Set、Map体系下众多的接口和类,各有特点和适用场景,很容易混淆。ArrayList和LinkedList,一个基于数组,一个基于链表,在随机访问和插入删除操作上性能差异明显,可我在实际编程时,总是难以快速判断在什么情况下该选择哪一个。在处理数据去重和排序时,HashSet和TreeSet的特性我虽然背得滚瓜烂熟,但一到实际应用,比如统计文章中不重复单词数量,或者对学生成绩进行排序,写代码时还是会出现各种问题。Map体系中的HashMap、TreeMap和LinkedHashMap,更是让我晕头转向,常常因为没有选对合适的实现类,导致程序运行结果不符合预期,排查错误时又毫无头绪。
3.比较器这块内容,Comparable和Comparator的概念理解起来还算容易,可真正运用到实际场景中,却困难重重。实现Comparable接口重写compareTo方法时,我经常把握不好比较逻辑,写出来的代码要么无法正确排序,要么出现奇怪的比较结果。使用Comparator接口自定义比较规则时,Lambda 表达式和方法引用的灵活运用更是让我力不从心。在对自定义类对象进行排序时,比如对学生对象按照不同条件排序,我总是在编写比较器代码时卡壳,反复修改调试,花费大量时间也不一定能得到正确的排序效果。

三、踩坑心得

1.添加注释更是不可或缺,对于复杂算法或关键逻辑,通过注释解释实现思路,能极大降低理解成本。在实际项目中,曾因未规范命名,导致接手同事花费大量时间梳理代码逻辑,严重影响项目进度。而遵循方法命名规范,采用动宾结构等合理方式,能使代码像自然语言般易懂,提升整体维护效率。
2.类和类间关系设计需扎根现实场景。单一职责原则确保每个类专注一项核心功能,避免功能混杂导致的维护困难。例如,订单类只负责订单相关操作,而不涉及支付细节。里氏代换原则保证子类可安全替换父类,增强系统稳定性。开闭原则使系统在扩展新功能时无需大幅修改原有代码,降低风险。合成复用原则鼓励优先使用聚合或组合实现代码复用,减少继承带来的耦合问题。依赖倒转原则让系统依赖抽象接口,而非具体实现类,提升可扩展性。遵循这些原则,能打造出结构清晰、可维护性强的系统架构。
3.逻辑错误是编程中常见的问题。在编写代码前,需仔细梳理业务流程,绘制流程图辅助理清思路。比如,在电商促销活动的价格计算逻辑中,若未正确处理满减、折扣叠加等规则,会导致价格计算错误。通过不断优化逻辑,多进行边界条件测试,能增强代码的健壮性,避免出现不合理的计算结果或异常情况。日常还需加强逻辑思维训练,如通过算法题练习,提升逻辑推理能力。
4.编程是一个不断学习和改进的过程。每次完成项目或功能模块后,都要进行复盘,分析代码存在的不足,思考是否有更好的实现方式。
5.拿到需求后,首先要深入理解需求细节,与需求方充分沟通,明确功能边界。接着,根据需求设计类间关系,绘制类图。类图能直观展现类的属性、方法以及类与类之间的关联、继承等关系,帮助我们提前规划系统架构,发现潜在问题。例如,在开发图书管理系统时,通过类图可清晰规划图书类、用户类、借阅类等之间的关系,避免后续开发中频繁修改代码,提高开发效率和代码质量。

四、改进建议及总结

1.在面向对象的学习过程中,刚开始只觉得这和c语言的差别不大,那个时候只是刚开始学习java的语法,到后面学习到继承的时候开始慢慢领会到面向对象和c语言的不同之处,也可以通过这个来联系到生活中许多软件开发的过程中应该是如何开发的。
2.还有在布置实验的时候感觉实验的作业每次在那个实验软件上编写打代码太过于麻烦,没有像idea这种工具可以有一些补齐的功能,这样很浪费时间,如果一定要用这个实验软件还是希望可以优化一下,便于学生适应。
3.作业难度希望能够循序渐进而不是一下突然变难,然后后面的难度还没有前面的难度高,前面突然一下太难让人很容易受挫希望可以改进这一点。

posted on 2025-06-18 13:13  风林FLin  阅读(20)  评论(0)    收藏  举报