面对对象设计与开发总结性Blog

一、前言

没想到这课程的学习就快要结束了,回想起来被PTA和实验支配的经历还历历在目。PTA嘛,小题目不需要太过于当心,你知道了题目再说什么要求什么就没事了,而且代码量也比较少,就是错了推倒从来也没有什么大问题,但是PTA里还有大作业。这可就是一步错步步错,我还依稀记得当年的电梯,只要你的逻辑错了一下下那么你的电梯就会出现蹦迪行为,那一天的电梯,蹦迪起来。总结起来就是,代码量大的,需要画图构思的,涉及知识点很综合全能的。

接着便是实验,依我看实验就是对课堂知识的加强稳固没有什么大难度,从把大象放入冰箱(类的设计)到把动物放入电器(多态与继承)再到动物电器可比较(可比较接口的使用)随着课堂的知识慢慢添加要求,然后还有Javafx使用不过这玩意大部分得自学没啥好说。不过这玩意工作量有点大,如果你一开始就是在提交系统里写的那没什么好说,但要是你是在编译器先写好,那么恭喜你,你将面临重新再填写一遍你的代码而且没有编译器那么智能偶尔还会调皮一下吞一下你的符号。

然后是Blog作业,要是你写的大作业是电影那么Blog作业就是观后感了,不过你既是导演也是观众从不同的角度分析你的电影给出优点和缺点然后总结出改进方法抛去3000字的硬性要求不谈对你的学习还是挺有作用的。

至于线上课程和线下课程,线下没听懂的线上听,线上没听懂的线下听,挺不错的总能够有一个让你听懂。而且线上课程每一节后还有小作业对这次课程有一个小测看看你掌握了多少挺好的。

二、面对对象技术总结

封装

封装指的是将对象的状态(属性)和行为(方法)包装在一起,并对外部隐藏内部实现细节。类似于防偷窥目的就是保护代码的安全性。封装的方法有很多可以使用不同的访问修饰符像"private","protected","public"等等,可以通过公共方法来访问修改其私有属性如getter和setter方法。

 

 

像这些题目便需要应用封装,将这些类给封装起来使用大大提高了代码的灵活性,可维护性。

由于几乎所有的作业都使用了封装分好各个类职责因此对其的运用很熟练。

继承与多态

继承允许我们将一个类(子类)基于另一个类来构造(父类)并且可以使用其方法,就好比父亲把东西继承给子女一样,不过一个类只能继承一个父类不能有多个父类。而多态则可以将继承下来的类进行重写让不同的对象有不同的方法大大提高了代码的可扩展性和层次结构。一般来说继承和多态是一起出现的,继承是实现多态的基础。而在作业中我也有很多地方应用到了继承和多态,最印象深刻的是在实验中,动物父类派生出不同的子类:

public class Animal{
private String name;
public Animal(String name){...}
public void makeSound(){...}
}
class Tiger extends Animal{
public Tiger(String name){...}
@override
public void makeSound(){...}
}

像这里便由动物派生出老虎类,当然也可以派生出狮子类等等各种动物类,如何确定好子类和父类一般来说子类是父类,如老虎是动物。这样才使用继承关系。

继承与多态可以很大程度上减少代码量并且提高美观度,在能使用继承多态情况下是一定会用的因此很熟练没有什么大问题。

抽象与接口

抽象类(abstract class),是无法被实例化的类,也就是说你不能new出来一个抽象类而是用作其他类的基类。一般来说抽象我都是用在继承关系中的父类,把父类抽象化。并且抽象类还可以有抽象方法,当然一般不需要实现而是让子类去实现抽象方法,不同的子类实现方法当然可以不一样,说实话我觉得有点像多态事实上确实有关系因为抽象是多态的基础,多态是抽象的体现。不过如果子类也是抽象类那就不需要一定实现父类的抽象方法了。像

abstract class Animal {
    abstract void eat();
    abstract void sleep();
}
abstract class Bird extends Animal {
  ...
}

这里Bird类就不一定需要实现父类里的eat和sleep方法了。抽象类的设计理念和继承一样也是"is-a"理念并且也是单继承。

而接口就不一样了,一开始我还觉得接口和抽象都差不多两个没什么区别但在后面的学习中我发现了差异。首先接口与抽象的"is-a"理念不同,接口着重于"can-do"理念,着重于能力有什么。能力可以有很多,自然接口可以多实现。例如在实验中可以实现可比较接口和有攻击力接口

public abstract class animal implements Comparable<animal>, HasAttack {
...
}
 interface HasAttack {
  int hasAttack();
}

这样便赋予动物可比较能力和攻击性能力。

不过我对于接口的使用还不是那么熟练,没有抽象那么简单,接口有很多的方法,除了默认方法,还有静态方法(在接口中可以定义静态工具方法),和私有方法(接口内部使用的辅助方法),因此接口还需要多加练习和理解。也因为接口比抽象更加的灵活因此在实践中都优先考虑使用接口而非抽象除了需要定义模板方法模式时使用抽象类。

集合框架

集合框架是Java中用于存储和操作数据的一组接口和类,它提供了高效的数据结构和算法来处理对象集合,有接口实现类和算法。实现类有很多如List实现:ArrayList(动态数组)、LinkedList(双向链表),还有Map实现,最常见的就是HashMap(哈希表)。其中最常见的就是ArrayList了,实现代码是

 List<String> arrayList = new ArrayList<>();arrayList.add("Java"); 

在实验种我便使用了ArrayList来存储每一个动物对象,这样就可以很方便地处理所存入的动物们能对其进行排序查找等操作。

private  List<animal> animals = new ArrayList<>(); // 使用ArrayList
...
animals.add(animal); // 添加动物

当然还有接口Collection。在实验4中便需要使用集合工具类对数组进行排序,可以直接使用Collections.sort(list),对传入的数组进行排序。

集合框架可以高效地处理来处理对象,但我对集合框架的使用也仅仅限于ArrayList的使用,掌握还尚欠缺,需要加强。尤其是哈希表,我几乎没有使用过甚至在使用哈希表能减少代码复杂度的情况下也不考虑使用。

异常处理

异常是程序运行时可能发生的不正常情况会中断正常的运行,异常有很多种比如空指针异常NullPointerException和我最常见的数组越界ArrayIndexOutOfBoundsException 。而Java对异常自然也会有自己的处理方式。使用try-catch-finally 块处理异常:

try {
    // 可能抛出异常的代码
} catch (ExceptionType1 e1) {
    // 处理 ExceptionType1 类型的异常
} catch (ExceptionType2 e2) {
    // 处理 ExceptionType2 类型的异常
} finally {
    // 无论是否发生异常都会执行的代码
}

捕捉在运行中可能遇到的异常并进行处理,当然对于可能产生的异常处理系统自带的异常还可以自己创建异常,进行自定义异常。假如我需要写一个遇到Wrong字符就抛出异常的异常可以创建

class WrongWordException extends Exception {
    public WrongWordException(String message) {
        super(message);
    }
}

然后再写一个方法来检测是否有关键字

public static void checkForWrongWord(String input) throws WrongWordException {
        if (input.toLowerCase().contains("Wrong")) {
            throw new WrongWordException("检测到禁止词汇: 'Wrong'");
        }
    }

最后使用

catch (WrongWordException e)

这样便可以捕捉我自定义的异常了。异常处理在平时的编写代码几乎不怎么使用到但在文件读写(I/O操作)中是必须运用到的,因为不同于直接在控制台里输入内容,文件读写操作有太多不可控因素如文件不存在,或者文件路径有问题等等,这种就会导致代码无法进行编译或者在运行时突然就崩溃,当然严重的甚至会破坏原本文件的内容因此在文件读写操作中一定需要用到异常处理,确保即使在发生异常的情况下资源也能被正确关闭不会被破坏。

由于很少有需要进行文本操作故而这个也应用的比较少基本都是在实验中用到文本操作掌握的不多。

 JavaFX

JavaFX是一个用于构建现代客户端应用的框架,对比起"上古真神"EGE来说,JavaFX更加人性化并且更加好用。它采用分层架构,核心组件包括承载应用窗口的 Stage、容纳可视化内容的 Scene,以及构成 UI 的各种 Node(如按钮、文本框等 Controls 和布局容器 Panes)。JavaFX 提供多种布局管理器(VBox、GridPane 等)自动管理组件排列,可以通过事件驱动模型处理用户交互,并支持属性绑定实现数据与 UI 的自动同步。并且界面样式可通过 CSS 定制,可以创建你想要的界面,而且内置动画系统简化了过渡效果实现。功能繁多能够实现可能性更强,可以先用来练习作为软件开发的基础。虽然实用性很强但是由于这部分内容是用翻转课堂(同学来讲解)形式来学习,故而对大部分的内容还是不太了解的,就比如CSS样式化和内置动画API,这两个对于使用JavaFX开发软件来说都是比较有用的部分但没有去讲解清楚甚至没有提及过在后面的实验中才慢慢了解到。

而我对于JavaFX的学习情况就比较一般了,最多是创建出一个比较简单的界面然后使用简单的动画演示,比如直线运动这种按简单规律运行的动画需要学习的地方还有很多。

三、踩坑心得

这学期的学习以来,踩过的坑太多太多了,一切的一切是从大作业开始的......

1.对面对对象职责不够理解。最开始我的代码很简单暴力,就像写C语言一样,把方法都一股脑全部扔到Main中,完全没有考虑到单一职责原则,或许一开始对哪些代码量很少并且很简单的问题这种方法没有什么大问题,但往后开始接触大作业后这种方法很快遭到了报应。在历经千辛万苦完成了第一次电梯调度作业后,第二次只是在第一次的基础上添加了一点条件但还需要按一下类图进行设计

 我除了需要对我的代码逻辑上进行修改,我还必须对我的代码进行大规模的重构使代码按以上类图进行设计,对当时本来就苦于捋清运行逻辑的我更是雪上加霜,最终惨遭白给。那时起我就下定决心在写下一次大作业前一定要先构思好类图,把类的职责先分配好再进行写代码,而不是之前的那种想都不想就先写代码。

2.忽视换行符导致出错。换行符这玩意真是一个又爱又恨的东西,它可以让你的输出美观一点也可以让你的输入无效。像是你一个输入后面有一个换行符但是你却没有清除换行符,那么这就导致你继续输入时就不能正常匹配输入了,因为还有一个换行符在你输入前面从而导致换行符被意外输入,结果毫不意外出错了,然后你还不知道到底是哪里出错了就一直在这里耗。我有一个室友,在期中考试第3题中就因为换行符的问题消耗了大量时间甚至结束了都找不到问题在哪里,这种问题平时不出现还好一出现就要出大问题了。在以后处理输出还需要花点心思在那里多多注意一下换行符问题,别最后"死无对证"。

3.需求分析不完全就开始处理问题。虽然说在动手之前要先动脑,但我是一个莽夫,先动手再慢慢思考问题。这样确实很爽,要是写到一半发现自己理解错了题目的意思那就更爽了,属于搬石头砸自己的脚自己还得给自己搽屁股。在电梯调度问题中我就犯过这种错误,一开始在并不了解电梯独特的运行情况时先按照现实电梯运行情况写了一遍,因为当时案例只给了一个而刚好又符合现实电梯的运行方式故而默认了这种逻辑,即使后面不对我也只是觉得是我还有哪些地方没有考虑到并不觉得是我的逻辑问题。直到后面一直没有人通过老师也在发文不断强调电梯的运行方式是LOOK算法我才幡然醒悟,从一开始我就误解了题目的意思从而陷入了我自己给自己挖的坑里面死活出不来。好在后面也是跳出来了并完成问题。至此,三思而后行牢记于心了。

四、改进建议及总结

在学习 Java 的旅程中,我们经历了从基础语法到复杂应用架构的探索。这个过程既充满了挑战,也带来了满满的收获。为了让后续的学习更加高效,自然需要对自己提出一些改进建议。

建议1:在以后的编写代码过程中一定要给出必要的注释,并且命名要符合逻辑。虽然以目前的工作量代码看一会就大概了解是什么作用,但在将来尤其是在正式工作中有注释的代码可以大大减轻你的负担,史山代码的形成离不开两要素一个是不写注释另一个就是命名随意了。你想想要是你在看代码过程中突然看到一个变量t,然后你接下来就必须要去观察这里t是什么意思有什么作用,最后发现起计算总值的作用,你说要是一开始就命名为Total不就不用这么麻烦吗?因此无论是为了我还是为了别人,写注释和合理命名真的很重要。

建议2:在写完代码后不要着急抛至脑后,继续完善完善该代码。不要觉得完成了就不需要再去管了,还需要多看看代码看看有没有地方还可以更好,比如我之前有一次作业中使用了二维数组来存储数据,后面我又发现还有一个更方便且美观的存储方式--ArrayList,那肯定是要修改运用的,这样还可以不断积累经验下一次遇到相同情况时便可以以最优方式解决了。

当然对于教师、课程、作业、实验、课上及课下组织方式等方面我也有一些问题。

首先便是在以后的作业中对于题目的要求可以再明确一些(不要再当谜语人了)这样可以少走一点坑,其次是实验提交系统,我不太明白为什么要去关闭复制粘贴功能,如果是要锻炼学生的敲代码速度完全没有必要用这个,因为我们在写的过程中并不知道到底有没有输错而错了还不一定能知道错了什么在哪里错了就很搞心态了,我有好几次因为这个而红温了。至于线上线下教学,线上没得说,线下的话让学生来讲解确实很不错,不过可以多留点时间给学生来讲解,这样效果才有一个内容8分钟可不一定可以讲全的。

总结:通过这段时间对 Java 的学习,我在语法基础、面向对象编程方面都取得了一定的成绩。掌握了 Java 的基本语法结构,能够熟练运用面向对象的思想进行程序设计,还学会了使用集合框架、多线程、IO 流来解决实际问题,并且通过大作业实验等增强了运用能力不断巩固基础,深化实践。

 

posted on 2025-06-17 20:49  病故  阅读(17)  评论(0)    收藏  举报

导航