一、前言:
第二次写Blog与上一次的心情完全不同,这几次作业的题目集侧重点变得分散,有助于我们更集中的处理较为复杂的知识点。这几次题目集才开始体会到面向对象的实际作用,可以说面向对象才是一个真正的进入软件的世界,我在这几次对待题目考虑较上次更加全面。题目集较上一次难度有所下降但是题目量增加,小的知识点分散在各个题目中,虽然作完之后分数不是很多但是成就感很多。题目集的知识点更有针对性,之前几次题目集的指导书,说实话没怎么在意只是看看大致内容马上就去实现代码。但是这几次题目集没有仔细看指导书我走了不少弯路,指导书还是要仔细看。我也发现我平时也不是很细心,题目集四的第三题和题目集五的第五题,我天真的以为就是简单改一下就能通过,但是我还是太年轻了。继承,多态,正则表达式,Array.list的运用,接口,抽象类这几次的题目集难度虽然降低但是涉及到的知识点一点也不简单,我需要学习的还有很多。代码还是出现很大的问题,就比如圈复杂度还是很高,我尝试改动代码但是圈复杂度还是没有下降,就证明我使用的还是C语言留下的知识,没有创新。下一次再写博客希望能有所提高。
题目集四(7-2)题目集五(7-4)两钟日期聚合比较)
(7-2)
我认为题中的那两个测试点应该是我主函数里的日期间隔不是很完善导致,存在只是传进去数但是输出总是错误,也检查我使用日期间隔求天数的方法,能考虑到的都在。之后在我后期和同学讨论的时候发现,我没有考虑到刚好边界的情况导致我这两个测试点没过,太不仔细了。而且此题目类与类关系很密切,我需要调用一个类一个类的方法连续调用,类之间的偶合性很高,老师上课强调好的代码尽量是高聚合低偶合,这道题也是想让我们理解高偶合的弊端。较题目集五第五题相比高聚合低偶合是怎么实现的,类与类之间的关系不是很大,出现问题和轻松就能找到问题存在,但是题目集四出现问题要在一个一个类里面看调用的是不是我们想要的,如果一个地方出错,我们往往要大改里面的方法,很麻烦对待后面的复用也不是很好,这点我很清楚,我再写题目集五的时候本想用一下上次代码,发现特别不好用,而且会出现有一些我本不应该出现的问题。可能测试点的改动后面的第五题和第四题也是截然不同。
改进建议:此题目改进在题目集四的情况下,改进题目集五的类图。判断语句尽量减少,代码中还是有很多繁琐的判断,代码整体性还是有点不规范,在题目集中大数判断是我刚开始很难过去的一点,以下s是我处理的方法。
第五次题目集无疑让我感受到高偶合性给我带来的好处,只要找到dateutil里的进行调用非常的方便很快就发现逻辑错误,我认为高聚合的优势也就体现了,再其次这次题目代码的可复用性较上一个有很大的改观。
题目集4(7-3)、题目集6(7-5、7-6)三种渐进式图形继承设计的思路与技术运用(封装、继承、多态、接口等)
题目集4(7-3):
此题子类继承父类我们也是第一次接触到这类题目,代码的完成比较顺利,继承也是我们学习JAVA的入门必须要掌握的技术,与其说是技术对于我们JAVA编程者是必须要学会的,在专业的角度来说继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。子类又被称为派生类; 父类又被称为超类(Super Class)。子类即使不扩充父类,也能维持父类的操作。子类还有一个特点:子类实际上是将父类定义的更加的具体化的一种手段。父类表示的范围大,而子类表示的范围小。现在默认调用的是无参构造,而如果这个时候父类没有无参构造,则子类必须通过super()调用指定参数的构造方法。重写也是本题我们第一次参与运用,大体意思是:是子类的方法覆盖父类的方法,要求方法名和参数相同,访问修饰符的限制一定要大于被重写方法的访问修饰符。重写是对类中方法的扩充,因为继承用的是父类的东西,重写则不仅得到父类的东西,同时也加入了自己的东西,这也只是我个人的理解。在查阅相关资料中官方的理解则更全面。官方理解:子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。 如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。当然重写也需要注意一些事项:1.发生方法重写的两个方法返回值、方法名、参数列表必须完全一致(子类重写父类的方法)2.子类抛出的异常下不能超过父类相应方法抛出的异常(子类异常不能大于父类异常)3.子类方法的访问级别不能低于父类相应方法的访问级别(子类访问级别不能低于父类访问级别。
题目集6(7-5)图形面积的求和,和比较此题问题看似简单但是这里运用我们刚学的多态性,对于多态我刚开始还是很陌生,引用老师的说法一个对象具备多种形态,也可以理解为事物存在的多种体现形态。
(父类的引用类型变量指向了子类对象,或者是接口的引用类型变量指向了接口实现类的对象)。此题通过实验报告能大概理解多态怎么用所谓的“多态”,简单的理解就是对象在不同情况下的不同表现,具体体现在定义和功能两个方 面,简单的总结一下,多态可以用“三个定义和两个方法”来总结。三个定义分别是父类定义子类构 建、接口定义实现类构建和抽象类定义实体类构建,而两个方法分别是方法重载和方法重写。本次作 业我们采用的是抽象类定义、实体类构建的方式。即 Shape 为抽象类,Circle、Rectangle 及 Triangle 为实体类。抽象的方法和抽象类的引用刚开始理解的不算透彻,但是具有抽象方法的一定是抽象类。抽象类无法直接创建对象,只能被子类继承后,创建子类对象。getArea()方法为抽象方法,功能为求得图形的面积;validate()方法也为抽象方法,对图形的属 性进行合法性校验;toString()继承自 Object,功能为输出图形的面积信息。
子类需要继承抽象父类并完成最终的方法实现细节(即重写方法,完成方法体)。而此时,方法重写不再是加强父类方法功能,而是父类没有具体实现,子类完成了具体实现,我们将这种方法重写也叫做实现方法。Array.list链表可以说是动态数组的应用,toArray()方法会返回List中所有元素构成的数组。刚开始用动态数组,用的不是很6但是用起来真的好方便。
踩坑心得:此题刚开始做就没想明白动态数组怎么存,这是我感觉遇到过很大的问题,在就是抽象类种方法的引用也是刚开始遇到很多困难。
三次正则表达式的应用
(1)题目集三次正则表达式相对前几次题目集正则相对简单,题目集六第一题查找QQ号是否合法。相对来说还比较好处理,刚开始写这道题也出现一些小错误。
采坑心得:
刚开始范围取的不对是{4-14},应该是{5-14}。
正则表达式训练-验证码校验
这道题也很容不易,也是在QQ号检测的基础上稍加修改就能完成,就是验证码有字母的检验。
该正则表达式用于检测字符串类型以及字符串长度。
正则表达式训练-学号校验:
满足条件:1、2位:入学年份后两位,例如20年;3、4位:学院代码,软件学院代码为20;5位:方向代码,例如1为软件工程,7为物联网;6位:班级序号;7、8位:学号(序号)。
运用的正则表达式用于分段式字符串检测,字符串中有固定的字符,只需要简单的通过正则表达式描绘出特性即可以完成检测。
统计Java程序中关键词的出现次数
".*//.*"用于检测数据和后续字符。
str1 = strx[i].replaceAll("//.*", " "); 将检测的字符串转化为空格。
".*/\\*.*?\\*/.*"检测/*和*/之间的字符。
str2 = str1.replaceAll("/\\*.*?\\*/", " ");将字符替换成空格。
".*\\\"([^\\\"]*)\\\".*"检测[]。
str3 = stry.replaceAll("\\\"([^\\\"]*)\\\"", " ");检测的结果替换成空格
str4 = strz.replaceAll("\\p{Punct}", " ")将标点符号换成空格。
关键字题目没有实现,后面在和同学讨论中才逐渐明白当时存在的问题,主要原因就是正则字符串处理转换我还是不太清楚,后续查找有关的做法才明白题目的主要处理手段,在这几次题目集中简单的正则还能实现,但是每次做到要求实现功能多的正则表达式,因为是初学者,在对知识点认知较少导致我
只要是做到有关正则的题目心里都有点畏惧感,应该在后面的学习多加练习,现在是我唯一能做的,希望下次做到正则大题我能做的好一点。
第二阶段Blog总结:
第二次的博客总结到这里就要结束了,与上次所有题目集来说这一阶段的题目集我收获的还是很多,上一次我们在类里面摸索,这一次我们在类基础上完成架构,在类设计的基础上,通过对继承,多态,接口等多方面学习,也逐渐明白各自的用法和存在的缺点,面向对象编程的思想这几次题目集我们才是真正走进JAVA编程的开始,面向对象编程不同于面向过程编程,在创立一个对象后便有明确的功能性,通过继承,多态,接口可以实现不同对象实现不同的功能,每一个类之间的关系逐渐优化高偶合低聚合的目标在不断改进,我们也在每一次的改进中理解到什么题目应该怎样去设计才能更好,我认为这才是题目集想要我们学到的东西,学习类属性的访问权限主要分为四个部分:public,private,protected,default;以及不同类的类型:实体类,业务类,接口类;在类设计上我们学习的思维越多有助于以后我们的编程基础,思路也逐渐变得开阔,在不同题目中都有自己独特的理解方式,尤其是日期题目的两次改动,让我真正理解聚合的用法,不同的设计方法效果完全不同。
对于字符串的处理,和正则表达试的应用掌握对复杂数据的校验,截取,替换,作为一种对字符和字符串处理的工具我应用的不是很流畅,也是我下一阶段主要练习的地方,对于LIST我感觉是真的好用,极大的优化代码,动态的数组,在C里面可以理解为指针
,对于字符串的学习我还有很多处理,学习总该是在不断的总结中寻找方向并且实现目标的过程。
课堂建议:老师传授我们编程思维,而不是针对某一道题目,我逐渐理解老师的用以,现在感觉到对于知识点的由浅入深快乐,每一次优化都是新的挑战。希望老师就在对我们写的PTA作业进行总的问题指导,进行点评或者讲解,总感觉一道题目拿到满分但是不知道自己应该在哪些方面应该优化,这也是我应该学习的但是还是希望老师多加点评。
第二阶段于此就告一段落了,首先感谢OOP课程的老师与助教的付出。我将会以全新的心态去完成后面的题目集,在后面的题目集中攻坚克难。