针对在java学习第二阶段中PTA作业的总结性博客

烂漫一生 提交于 2020-07-29 09:46:00

  0.前言:

  本次博客是主要针对在java学习第二阶段中的PTA作业的总结性博客,第二阶段的作业的难度与第一次阶段相比有了提高,对java的知识点的考察主要集中在正则表达式、类的继承等。

  1.作业过程总结:

  (1)总结三次作业之间的知识迭代关系:

  第五次作业共三道题,第一题考察了对正则表达式的运用,正则表达式就是用于检索符合某个模式的文本,而这个模式则是由你编写的字符串编译而来,你根据你所需要查找的文本格式编写字符串,再利用Pattern类对编写的字符串进行编译产生该类对象,再利用该类对象中的matcher方法产生Matcher类对象,matcher对象的参数是需要分析的文本,使用前需要引入Matcher类和Pattern类;第二题考察了类之间的关系;第三题考察了类的继承,继承的关键字是extends,子类不能继承父类的构造方法,如果需要使用父类的构造方法使用关键字super,这里需要注意,super()需要放在第一行且只能有一条语句,且this和super不能同时使用;

  第六次作业共两道题,第一题考察类的继承与多态,题中的父类Shape与之前的父类不同的是,它是一个抽象类,即它其中有方法只有方法名字、形参列表,没有方法体,抽象类需要在class前加上关键字abstract;第二题考察了正则表达式、String一些方法的利用和ArrayList对象列表,对象数组可以储存对象引用,但是长度固定,用ArrayList储存对象,任何类的对象都可以插入,题中有有String类的trim()的运用,作用是除去字符串两把多余的空格;

  第七次作业共三道题,第一、二道题涉及到类对接口的实现,接口的关键字是interface,在类之前添加该关键字表面这是一个接口,接口中的方法与抽象类相似,但接口中的方法都没有实现,类只能继承一个类,但可以实现多个接口,使用关键字implement,常用接口Comparable的运用,该接口的作用是强行对实现它的每个类的对象进行整体排序;第三道题是加分题,考察的不是java知识点的学习,是对算法的利用。

  (2)如何通过作业逐步理解面向对象的封装性、继承性与多态性三大技术特性:

  关于面向对象的封装性,类的属性和方法会被隐藏,用户不需要知道使用类内部的细节,只需要知道如何使用即可,保证了类内部数据结构的完整性;而继承性中, 父类的私有属性和方法会对子类隐藏,子类可通过super关键字使用父类的属性和方法,也可以对父类方法进行覆盖;本阶段的继承主要是类对抽象类和接口的继承,类只能继承extends一个类,但可以实现implements多个接口,子类需要实现抽象类或接口中的所有不完整的方法,也就是说,多个子类继承于一个父类或实现一个接口,这些子类中会有相同的方法,而子类和父类可以在一定条件下相互转化,每个子类都是父类的实例,若为一个父对象赋值不同的子对象,则父对象可使用不同子对象的相同方法,即父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作,也就是面向对象的多态性

  (3)作业过程中遇到的问题及解决方法:

  第五次作业的问题主要集中在第一题水文数据校验及处理,因为这道题主要考察的是正则表达式,但上课的时候我都没怎么理解如何使用,正则表达式有什么用,在看到这道题的时候完全不知道怎么入手,在第一步读取数据的时候就出现了一点小问题,先利用Scanner类读取一行,再添加到StringBuilder类的对象中,但是所有数据读进去以后,都是一行到底,也就是说与输入格式不符,后想到可以在添加时加一个换行符解决问题;当然这道题的主要问题不是在这里,而是在对于正则表达式的编写,那个时候的*?\等符号单个使用时的作用我还能理解,但是连在一起的时候我就傻了,于是我花了几个小时去研究正则表达式的使用,去网上查找各种资料,对Matcher类方法的使用,后来自认为有所理解的去写这道题,用了一天时间,发现测试点多条正确数据和测试点每一列均有误永远是答案错误,而当时还有两天就作业截止了,我就满程序的找bug,我就把目光转移到了对日期的检测,会不会考察平年闰年的时间?心中产生了这样的疑问,然后去问同学,同学的回答是会,我当时快绝望了,因为若考察平年闰年的时间,正则表达式的编写难度上升了不止一点,在csdn上看到了有关博客,才解决问题,期间还重写了两次代码,但是 还有最后一个测试点多条正确数据过不去,同学告诉我说不但要用String类的trim()方法删去两边的空格,也要无视中间的空格,在其中一个根据“\t”分割字符串的操作中略微修改即可。写这道题用了我整整两天时间,还好写出来了。而第二、三题没有什么太大的问题。

  第六次作业第一题图形继承与多态,出现一个小问题在于编写程序时没有给父类对象赋予子类对象,所以在遍历对象数组时不知道如何实现多态,后查询资料后解决成功。第二题一元多项式求导依然考察的是正则表达式,而得益第五次作业的第一题对正则表达式的研究,而所需要求导的函数的正则表达式的编写有一定规律,但在求导后,对“+”是否出现下了不少功夫,对ArrayList的使用也是,因为我认为ArrayList可以容纳任何不同类型的对象,于是在声明时这样写:private ArrayList list = new ArrayList();发现这种写法不通过,仔细看题目所给类图发现正确的写法应该是private ArrayList<Term> list = new ArrayList<Term>();该list列表的元素全是Term对象引用,再利用for循环和list.size进行遍历,从而使用相同父类,不同子类的方法。

  第七次作业的第二题图形卡片分组游戏其实是在第一题图形卡片排序游戏的基础上对卡片进行分类,我本来的想法是建立一个元素是集合的集合,也就是ArrayList<ArrayList<Card>> list = new ArrayList<ArrayList<Card>>();这样,但是通过实践发现这样行不通,于是我只能用更简单粗暴的代码——通过多加几个for循环来解决问题。值得注意的是,在编写第一题的代码时,所有代码都能成功编译,但是无法得到我想要的结果,后来发现,是在编写Card构造方法时,虽然参数成功传递,但是没有将其赋予类的私有变量,私有变量持有编译器默认值,导致一直得不到想要的结果。而第三题求素数,若是按照在学C时老师交的方法来写,也只能勉强通过测试点,达不到最短时间的目的,但已经有同学的时间达到一百多ms,而我的最快也就六千多ms,于是通过网络查找学习算法,将时间缩短到了250ms左右。

  (4)每次作业花费的时间比例:

  第五次作业花费时间较长大概花了4天,第六、七次作业花费时间大概是2到3天。

  (5)对编程过程的严谨性的认识及教训:

  在编写代码时要保证高度的严谨性,我在编写构造方法时,仅仅是因为没有通过构造方法为变量赋值,就花了不少的时间寻找错误的位置。也不能完全按照题目所给的类图来写,比如第五次作业的第一题,若不是同学告诉我类图有问题,我可能需要花费更长的时间,在根据类图编写代码时需要加上自己的思考,不能只跟着类图一路写下来。继承类更是要记住类的封装性,以及关键字super使用的具体规则。

  2.OO设计心得

  (1)对面向对象三大技术特性之间关系的理解:

  我认为面向对象三大技术特性之间的关系是非常密切的,封装性保证了类内部成员的密封性,外界程序不能轻易修改类内部数据,提高了程序的安全性和可靠性;继承是类与类之间的一种十分重要的关系,子类可通过super关键字调用父类的属性和方法,子类也可以重写父类的方法;而子类对抽象类的继承、对接口的实现从而产生了多态性,通过父类的引用访问继承层次中子类的对象。

  (2)面向对象设计的基本原则理解(单一职责原则及“开-闭”原则):

  面向对象设计有五个基本设计原则,而其中的单一职责原则核心思想是一个类,最好就做一件事,只有一个引起它的变化,若一个类的功能太多,其中一个功能出现错误,可能会导致该类的其他功能出错,而根据类与类之间的关系,可能会导致其他类的功能发生错误,对程序的运行产生极大的影响。而“开-闭”原则的核心思想是软件应该是可拓展的,不可修改的,若只对代码进行拓展,出现错误,只需要在拓展部分寻找错误即可;但是若对代码进行修改,按老师教导的话来说,原来的软件测试的很好,但是经过修改以后又要重新测试,造成极大的人力物力的浪费。

  (3)OO编程思维的理解:

  在编写程序的时候,我们应当牢记,我们现在学习的是面向对象,关注点是什么东西能做什么,而不是什么东西怎么做,应积极改变自己的思维,不能将思维锁死在一处,万物皆是类,所以面对问题,我们首先需要确定,问题涉及到的对象,再根据对象的行为构造类,确定类与类之间的关系,保证类的单一原则和开闭原则,注意抽象类和接口的设计。

  (4)类设计心得:

  在编写类时需要充分利用类的单一职责的原则,通过类图编写类的属性和方法的作用域,类与类之间的关系,也要注意类的继承关系,关注子类对父类方法的重写,子类对父类属性的使用,类的设计是为了使问题简单化,而不是复杂化,类与类之间的关系应尽量简单,而不是复杂,否则会对你解决问题产生巨大的影响。

  3.测试的理解与实践

  (1)测试对于编码质量的重要性:

  测试对于编码质量是非常重要的,即使我们还处于完成作业的阶段,我们也应该对自己所编写的代码持有高度的严谨性,所通过的测试点越多,说明编写的代码质量越高,同时也要注意对测试点的选择,选择继承测试点的同时也要设置边界测试点,可以知道所编写程序的不足。

  (2)查阅资料,假设使用Junit进行程序的测试是否可行:

  通过查阅资料,使用Junit进行程序的测试是可行的。

  4.课程收获:

  收获:在这一阶段的课程中收获很多,学会了正则表达式的使用,三大技术技术特性封装性、继承性、多态性,java对类的运用也比我们想象中要灵活的多,我也在这一阶段对String类的部分方法的运用有了更深刻的理解,ArrayList对象列表也比对象数组灵活,我们需要学习的地方还有很多;

  教训:课后需要积极查询资料自学,仅依靠老师上课所传授的知识无法解决作业问题,课后也需要根据老师在课程中的代码多进行实践,只有理论上的知识是不够的。

  5.对课程的建议:

  (1)第三阶段作业难度、题量的建议:

  我认为这一阶段的难度比上一阶段提升不少,题量和上一阶段差不多,我知道下一阶段的难度会提升,但希望不要提升太多。

  (2)课程内容讲解方面的建议:

  我没有太多建议,我能理解老师作业查重,但是对于第三次作业第一题解方程,主函数给定,类图给定,除非不按类图和主函数写,否则查重率不会低的,这道题也是我这么多次作业唯一超过要求的,希望老师能理解。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!