Java第二次博客作业
1.前言:
总结三次题目集的知识点、题量、难度等情况
作业四
本次作业,共分为三道题,第一道题的难度比较较大,水文数据的处理与检验,考察了正则表达式的相关内容,是本次习题集较难的一道题目。第二题考察了用类的聚合关系,求下n天,前n天,以及两个时间节点的相差天数,第三题考察了,采用类的继承来解决图形的面积问题,以及子类对于父类的方法重写,第一道的水文数据的处理与检验,是本次习题集较难的一道题目,不仅考查了我们对于正则表达式的熟练程度,而且也考察了我们对于字符串的处理,怎样划分字符串等等。
作业五
第一题考察了ASCII编码的理解和寻找最大的ASCII编码值算法的使用。第二题考察的是数组的相关知识,合并可以用第三个数组表示,再对第三个数组进行排序处,还考察了排序算法的使用。第三题考察的是三种排序算法(选择排序法、冒泡排序法、插入排序法)的书写。第四题考察了三大集合(List、Set、Map)的使用,实现List或Set存储单列数据,Map存储双列数据,细分又涉及到了List中ArrayList和Map中TreeMap等类的使用,同时考察了对字符串进行处理(使用正则表达式判断数据,如使用split()函数分割字符串)。第五题与作业四相似,考察了类与类之间的聚合关系,此题与日期问题面向对象设计(聚合一)版本不同的是类之间的聚合关系发生了变化,其中各个类之中的方法等没有发生多大变化。
作业六
习题集六,有了一些提升我们正则表达式的小题,难度较为简单,只需要我们写出对应的正则表达式,即可解出这三道题目,这三道关于正则表达式的题目相对于前两次的正则表达式的难度有所下降,难度为简单,第二题字符串排序,考察了这个题考察了我们,字符串中的字符转化为ASCII码进行升序排序,首先我们需要掌握字符转化为ASCII码值的方法,在运用学到的排序方式进行排序即可。第五题,图形的多态与继承,是本次题目集中最难的一道题目,考察了类的继承,多态性以及使用方法,第六题考察了抽象接口,以及接口的实现,难度为中等,主要是我们对于接口的理解和实现。
2.设计与分析
①题目集4(7-2)、题目集5(7-4)两种日期类聚合设计的优劣比较
7-2 日期问题面向对象设计(聚合一) (35 分)
参考题目7-2的要求,设计如下几个类:DateUtil、Year、Month、Day,其中年、月、日的取值范围依然为:year∈[1900,2050] ,month∈[1,12] ,day∈[1,31] , 设计类图如下:
7-2 日期问题面向对象设计(聚合一) (35 分)
参考题目7-2的要求,设计如下几个类:DateUtil、Year、Month、Day,其中年、月、日的取值范围依然为:year∈[1900,2050] ,month∈[1,12] ,day∈[1,31] , 设计类图如下:

应用程序共测试三个功能:
求下n天
求前n天
求两个日期相差的天数
应用程序共测试三个功能:
求下n天
求前n天
求两个日期相差的天数
7-4

圈复杂度

总结:总的来说习题集五的日期类要优于习题集四的日期类,不论是从圈复杂度还是从类图中类与类之间的关系都可以看出,习题集五的日期类设计要优于习题集四的日期类设计,习题集五的日期类设计之间的耦合性更低,类与类之间的关系也较少,符合我们最近所学习的面向对象设计原则,习题五类的设计职责也比较单一,符合单一职责性。
从这几点分析来看,习题集五的类的圈复杂度虽然低于习题集四日期类的圈复杂度,但两者的圈复杂度都是大于16的,已经是需要进行重构的了,但是这是我们平时解题,以解决问题为主来设计代码,所以在开始设计的时候,我并没有注意圈复杂度,或者怎样减少圈复杂度
在性能上,题目集5(7-4)更高效,因为代码运行只需要对整体部分(即DateUtil类)进行处理,运行时调用相应的部分即可,不需要像题目集4(7-2)那样层层递进。
②题目集4(7-3)、题目集6(7-5、7-6)三种渐进式图形继承设计的思路与技术运用(封装、继承、多态、接口等)
7-3 图形继承 (15 分)
编写程序,实现图形类的继承,并定义相应类对象并进行测试。
类Shape,无属性,有一个返回0.0的求图形面积的公有方法public double getArea();//求图形面积
类Circle,继承自Shape,有一个私有实型的属性radius(半径),重写父类继承来的求面积方法,求圆的面积
类Rectangle,继承自Shape,有两个私有实型属性width和length,重写父类继承来的求面积方法,求矩形的面积
类Ball,继承自Circle,其属性从父类继承,重写父类求面积方法,求球表面积,此外,定义一求球体积的方法public double getVolume();//求球体积
类Box,继承自Rectangle,除从父类继承的属性外,再定义一个属性height,重写父类继承来的求面积方法,求立方体表面积,此外,定义一求立方体体积的方法public double getVolume();//求立方体体积
注意:
每个类均有构造方法,且构造方法内必须输出如下内容:Constructing 类名
每个类属性均为私有,且必须有getter和setter方法(可用Eclipse自动生成)
输出的数值均保留两位小数
主方法内,主要实现四个功能(1-4): 从键盘输入1,则定义圆类,从键盘输入圆的半径后,主要输出圆的面积; 从键盘输入2,则定义矩形类,从键盘输入矩形的宽和长后,主要输出矩形的面积; 从键盘输入3,则定义球类,从键盘输入球的半径后,主要输出球的表面积和体积; 从键盘输入4,则定义立方体类,从键盘输入立方体的宽、长和高度后,主要输出立方体的表面积和体积;
假如数据输入非法(包括圆、矩形、球及立方体对象的属性不大于0和输入选择值非1-4),系统输出Wrong Format

先建立一个图形Shape父类,内含一个求面积的方法getArea(),然后用Rectangle类和Circle类继承Shape类,然后Box类和Ball类分别继承Rectangle类和Circle类,并且各个子类都再次重写了相应的求面积方法getArea()。
技术应用分析:运用了封装、继承技术,将各个对象的属性进行private封装,同时用了extends将子类Rectangle、Cirlce继承父类Shape,而Box类和Ball类又各自继承Rectangle类和Circle类。
7-5类图

这道题的设计上与题目集4(7-3)相比,略有加深,首先图形类Shape变为抽象类,方法为抽象方法,且多加了检验数据合法性方法validate()和输出面积信息方法toString(),相应的各个子类都重写了getArea()、validate()、toString()方法。同时代码中多加了排序方法sort()和求面积总和方法sum()和检验图形数据合法性的方法checkShape(),因为排序方法sort()要求用动态数组ArrayList型储存图形对象,所以就在Main类中定义排序方法sort()和求面积总和方法sum()以及验证图形数据合法性方法checkShape(),方便操作图形对象。
技术应用分析:运用了封装、继承、多态技术,将各个类的属性private封装,Rectangle类、Triangle类、Circle类继承Shape类,新建对象时运用多态的定义格式(父类类型 变量名 = new 子类类型();)。
7-6类图

抽象接口实现图形的面积求法:首先定义一个getArea的抽象接口,里面有抽象方法getArea,再在Rectangle和Circle两个类中,实现对于抽象类以及抽象方法的实体化,从而实现了求图形面积。
这三道题都是关于图形的继承与多态的,但是在设计上却有着许多的区别,题目集4(7-3)和题目集6(7-5)采用的是类与类的继承关系,这不仅提高了代码的复用性,而且还提高了代码的可维护性,而题目集6(7-6)不仅用到了继承,而且还在这个基础上用到了接口这一设计理念,使该程序的设计变得更加清晰和简便。同时呢,也可以方便对程序功能的扩展,通过实现接口,Java可以实现多实现(一个类可以实现多个接口,即一个类可以有多个功能)。
总结:不论是继承还是多态,或是抽象接口都是为了提高我们的代码的封装性,怎样减少子类与父类之间的耦合性,以及怎样提高我们代码的封装性,都是我们在今后的学习中更多的需要重视的地方,我们所学到的方法更多的是,让我们有更好的编程思维。为了更好的提高代码的复杂性。
③对三次题目集中用到的正则表达式技术的分析总结
列出一些用到过的正则表达式语法符号:
匹配数字:\d或[0-9]
匹配非数字:\D或[^0-9]
匹配字母、数字、:\w或[0-9A-Za-z]
匹配非(字母、数字、):\W或[^0-9A-Za-z]
匹配某个特定字符:x或[x],其中x表示某个字符,如w或[w]表示匹配w字符,(注,某些字符要进行转义,比如[\/]表示匹配/)
匹配二者之一:|
匹配0次或多次:*
匹配1次或多次:+
匹配0次或1次:?
匹配n次:{n}
匹配n到m次:{n,m}
结论:毫无疑问,用正则表达式更加简便,而且相比较与传统的用if、for循环来说,复杂度更低
通过三次习题集的正则表达式练习题,使我们对于正则表达式有了更深入的了解,提高了我们对于字符串处理的能力,正则表达式,就是们设定的一种关于字数串是否合理的一些表达式,用他们就可以检验出,我们输入的数据是不是合法,如果合法再进行进一步的处理,另外在这次题目中也渗透了一些关于字符串处理的方法,比如字符串数组的划分等等,都提高了我对于字符串的处理能力。
④题目集5(7-4)中Java集合框架应用的分析总结
Java 集合框架概述 一方面, 面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储。另一方面,使用Array存储对象方面具有一些弊端,而Java 集合就像一种容器,可以动态地把多个对象的引用放入容器中。
因为题目要求使用List、Set或Map中一种或多种中的一种或多种,这里经过自行百度等方法不断去寻找相应的知识并且对三大集合List、Set、Map有了一定的了解,在本次作业中,主要采用了List接口中的ArrayList类和Map接口中的TreeMap类实现题目要求。
1.本次题目涉及到的集合框架
1 Map<String, Integer> map1=new HashMap<String, Integer>();
该接口中所包含有三个方法
get方法:获取指定键(key)所对应的值(value);
put方法:将指定的键与值对应起来,并添加到集合中;
remove方法:根据指定的键(key)删除元素,返回被删除元素的值(value)
使用集合框架的好处
1.我认为集合框架,很方便的帮助我处理了数据,在编程时提供了很多的便利,可以对我们进行储存的数据,进行很好的查阅和修改,方便了我们对数据的处理。
2.集合框架中的一些遍历的方法,都极大的减少了我们代码的圈复杂度,使我们的代码看上去简洁的同时,又实现了功能.
3.集合框架真的很方便。
4.集合框架相对于数组,我认为,数组只要确定了,他的长度也确定了,二而集合框架是一个动态的长度,根据我们的需要往里面添加数据。
5.我认为集合框架一定程度上也简化了我们的代码,不论是遍历,还是插入等,比起我们用数组for循环遍历好了许多。
3.踩坑心得:
经过这几次的题目集,在不断修改与提交代码当中也学习到了许多的,踩了许多坑,也懂得了不少。这里面有一点我特别想提,就是关于日期类的题目,一定一定要特别特别的仔细,不然的话就会像我前两次写的题目集当中的日期类练习一样,总是一直感觉自己写的没有毛病,但是每次都得不到真确的结果,然后回去检查看代码,看个好几天也没有发现什么问题,但是结果就是一直对不了,当时就特别的郁闷,直到好久以后回想起来才发现好像是自己判断闰年与那个月份天数之间的调用出现了一些问题,导致在计算总天数的时候一直出现错误
在设计类的时候,圈复杂度还是较大,怎样减少圈复杂度也是我今后要学习的一个地方。
4.改进建议
①减少圈复杂度,在网上查找的减少圈复杂度的方法,都可以减少我的代码圈复杂度,比如用switch代替if else ,减少判断。
②代码的设计应尽可能的具有单一职责性,一个功能一个类,功能越复杂的类的代码其复用性越差,越不利与我们对于代码的复用。
③减少代码与代码的耦合性,一个类应该对自己需要耦合或者调用的类知道的越少越好,遵循迪米特原则
④设计子类和父类,对于需要不断进行更改和使用的方法应该进行抽象化,用子类去继承他们,减少我们对于代码的修改,遵循开闭原则。
5.总结
这三次题目集虽然收获的感触没前三次的深刻,但还是有不少收获的。
关于类的概念,这三次题目集让我深刻的认识了类的三大特性(封装、继承、多态),也认识了类的几种关系(继承、聚合、实现),补充了前三次题目集对类不熟悉的地方。这三次题目集对于数据的合法性用正则表达式比较迅速高效,说明正则表达式在对这方面还是有不小的作用的。
关于作业,我觉得应该加大点对新的基础知识的应用,比如这次的三个集合的应用,每道题都应该要涉及一些前面题目不曾出现过的知识点,这样才会有很大的收获。
浙公网安备 33010602011771号