java题目集4-6总结

前言

第四次题目集主要知识点是正则表达式,聚合,继承的实现,题量较少,每个知识点就只有一道题目,对于刚学这几个知识点的我来说很难,我花了大量时间来写7-2和7-3,导致7-1还没来得及写就到提交时间了,截止后后我自己写了一片圈复杂度极高的只有if-else的正则表达式判断代码把这题解决了。

第五次题目集主要知识点是聚合,正则表达式,map的运用,字符串语法,排序,题量适中,每个知识点也是只有一道题目,经过上次题目集的练习,我写这几道题目的思路清晰了不少,但是7-4统计java程序中关键词的出现次数中map类和正则表达式里的Pattern类和Matcher类我第一次使用,我参照网上这几个类的实例,自己写了一些代码来测试这几个类怎么使用,结果发现好像这个才是正则表达式的正确打开方式,map类我倒是觉得没有很特别,就是键值的新概念和里面的方法用起来比较简便而已,自己写一个类模仿map类应该也能用的不错,写这题我花的时间很多,远远多于另外三道题目加起来的时间。

第六次题目集主要知识点是正则表达式,字符串排序,继承以及多态,接口以及多态,题量较多,正则表达式有三道题目,其他知识点都是一道,对于写出前两次题目集的我来说,这次正则表达式的题目十分简单,继承和多态,接口与多态也并不复杂,难的点在于如何理解继承,接口,多态。经过很久的思考和查阅资料,我才有了自己的一点想法。

 

设计与分析:

①题目集4(7-2)、题目集5(7-4)两种日期类聚合设计的优劣比较

7-2 日期问题面向对象设计(聚合一) 

参考题目7-2的要求,设计如下几个类:DateUtil、Year、Month、Day,其中年、月、日的取值范围依然为:year∈[1900,2050] ,month∈[1,12] ,day∈[1,31] , 设计类图如下:

类图.jpg

应用程序共测试三个功能:

  1. 求下n天
  2. 求前n天
  3. 求两个日期相差的天数
7-5 日期问题面向对象设计(聚合二) 

参考题目7-3的要求,设计如下几个类:DateUtil、Year、Month、Day,其中年、月、日的取值范围依然为:year∈[1820,2020] ,month∈[1,12] ,day∈[1,31] , 设计类图如下:

类图.jpg

应用程序共测试三个功能:

  1. 求下n天
  2. 求前n天
  3. 求两个日期相差的天数

圈复杂度比较:

 

 

 

关系分析:

这两道题的效果几乎是一样的,不同的是聚合的关系,第一题是Month和Year之间是聚合关系,Day和Month之间是聚合关系,DateUtil和Day之间是聚合关系,第二题则不一样,它是DateUtil分别和Day,Month,Year之间是聚合关系。在我看来,每种关系的使用要看它的具体使用情况,在考虑单个日期这方面,天应该和月和年之前有着聚合关系,毕竟要知道日期单知道任何一个都不行,要全部都知道,要知道月份也要知道年份,而年份就只要知道年份就行。这样看来是不是就是第一题中的聚合关系更好,但是有些情况却是第二种更好,例如在分析两个日期时,如果用第一种的话方法来回的调用就会十分繁琐,用第二种就没这个问题,他就可以单拿出天,月,年来比较,方法上就用各自的方法就行,这样就十分清晰,他淡化了年,月,日之间的联系,却让问题更好的实现了。代码的实现上,第二种聚合关系也比第一种聚合方法简单许多。最后,在不同的方向上,不同的聚合方法会有不同的效果,在同一个方向,还是选择简单易懂的聚合关系进行实现比较好。

  ②题目集4(7-3)、题目集6(7-5、7-6)三种渐进式图形继承设计的思路与技术运用(封装、继承、多态、接口等)

7-3 图形继承

编写程序,实现图形类的继承,并定义相应类对象并进行测试。

  1. 类Shape,无属性,有一个返回0.0的求图形面积的公有方法public double getArea();//求图形面积
  2. 类Circle,继承自Shape,有一个私有实型的属性radius(半径),重写父类继承来的求面积方法,求圆的面积
  3. 类Rectangle,继承自Shape,有两个私有实型属性width和length,重写父类继承来的求面积方法,求矩形的面积
  4. 类Ball,继承自Circle,其属性从父类继承,重写父类求面积方法,求球表面积,此外,定义一求球体积的方法public double getVolume();//求球体积
  5. 类Box,继承自Rectangle,除从父类继承的属性外,再定义一个属性height,重写父类继承来的求面积方法,求立方体表面积,此外,定义一求立方体体积的方法public double getVolume();//求立方体体积
  6. 注意:
  • 每个类均有构造方法,且构造方法内必须输出如下内容:Constructing 类名
  • 每个类属性均为私有,且必须有getter和setter方法(可用Eclipse自动生成)
  • 输出的数值均保留两位小数

主方法内,主要实现四个功能(1-4): 从键盘输入1,则定义圆类,从键盘输入圆的半径后,主要输出圆的面积; 从键盘输入2,则定义矩形类,从键盘输入矩形的宽和长后,主要输出矩形的面积; 从键盘输入3,则定义球类,从键盘输入球的半径后,主要输出球的表面积和体积; 从键盘输入4,则定义立方体类,从键盘输入立方体的宽、长和高度后,主要输出立方体的表面积和体积;

假如数据输入非法(包括圆、矩形、球及立方体对象的属性不大于0和输入选择值非1-4),系统输出Wrong Format

设计的类图:

7-5 图形继承与多态 

掌握类的继承、多态性及其使用方法。具体需求参见作业指导书。

输入格式:

从键盘首先输入三个整型值(例如a b c),分别代表想要创建的Circle、Rectangle及Triangle对象的数量,然后根据图形数量继续输入各对象的属性值(均为实型数),数与数之间可以用一个或多个空格或回车分隔。

输出格式:

  1. 如果图形数量非法(小于0)或图形属性值非法(数值小于0以及三角形三边关系),则输出Wrong Format
  2. 如果输入合法,则正常输出,输出内容如下(输出格式见输入输出示例):
  • 各个图形的面积;
  • 所有图形的面积总和;
  • 排序后的各个图形面积;
  • 再次所有图形的面积总和。

设计的类图:

 

7-6 实现图形接口及多态性 (30 分)
 

编写程序,使用接口及类实现多态性,类图结构如下所示:

其中:

  • GetArea为一个接口,无属性,只有一个GetArea(求面积)的抽象方法;
  • Circle及Rectangle分别为圆类及矩形类,分别实现GetArea接口
  • 要求:在Main类的主方法中分别定义一个圆类对象及矩形类对象(其属性值由键盘输入),使用接口的引用分别调用圆类对象及矩形类对象的求面积的方法,直接输出两个图形的面积值。(要求只保留两位小数)

输入格式:

从键盘分别输入圆的半径值及矩形的宽、长的值,用空格分开。

输出格式:

  • 如果输入的圆的半径值及矩形的宽、长的值非法(≤0),则输出Wrong Format
  • 如果输入合法,则分别输出圆的面积和矩形的面积值(各占一行),保留两位小数。

 

设计的类图:

 

圈复杂度比较:

 

 

 

 

设计思路:

第一题的Ball继承Circle,Circle继承Shape,Box继承Rectangle,Rectangle继承Shape。

第二题的Circle继承Shape,Rectangle继承Shape,Triangle继承Shape。

第三题的Rectangle继承接口GetArea,Circle继承接口GetArea;

技术运用和思考:

第一题主要是让我重写父类里的getArea方法,然后执行父类的构造方法,然后在子类里写子类自己独有的属性,写他自己的方法;

第二题我用到了封装,让类里的属性无法被直接修改,需要用到类里给出的公用方法进行修改,子类重写父类里的validate方法,getArea方法,然后在子类里写自己的构造方法和子类自己独有的属性,并且可以在父类的数组集合中new新的子类,存在其中,并调用;

第三题用到了接口和继承,子类一样可以重写父类方法和抽象方法,可以用引用接口,并实例化一个子类,但是只能用接口里的方法,可以用引用父类,并实例化一个子类,但是只能用父类里的方法,如果是new一个子类,就可以子类里的全部方法,这题让我开始渐渐懂得了继承,多态,接口的真正含义。而且因为子类只能继承一个父类,但可以继承多个接口,所以父类一定是要最适合做子类的父类的,要符合大部分人的想法,比如老虎是肉食动物,也是哺乳动物,在生物界,要确定老虎的父类,一定是老虎的父类是哺乳动物,那肉食性怎么办呢,这里接口的好处就体现了,老虎可以是肉食动物,可以跑,游泳,这些就是老虎的一些天赋,可以用几个接口实现,同时其他的动物也可以用这些接口,就是需要重写其中的方法。

③对三次题目集中用到的正则表达式技术的分析总结

技术分析:

正则表达式有许多代指数字,字符的表达式,还有一些表达式是表示出现的次数,是否出现等,用matches方法就可以把符合的识别出来,符合返回true,不符合就返回false,这些功能很强大了,但是加上了Pattern类和Matcher类就更加强大了,它可以把一些不符合要求的字符串删除,保留剩下的符合要求的字符串。

 ④题目集5(7-4)中Java集合框架应用的分析总结

7-4 统计Java程序中关键词的出现次数 
编写程序统计一个输入的Java源码中关键字(区分大小写)出现的次数。说明如下:
  • Java中共有53个关键字(自行百度)
  • 从键盘输入一段源码,统计这段源码中出现的关键字的数量
  • 注释中出现的关键字不用统计
  • 字符串中出现的关键字不用统计
  • 统计出的关键字及数量按照关键字升序进行排序输出
  • 未输入源码则认为输入非法

输入格式:

输入Java源码字符串,可以一行或多行,以exit行作为结束标志

输出格式:

  • 当未输入源码时,程序输出Wrong Format
  • 当没有统计数据时,输出为空
  • 当有统计数据时,关键字按照升序排列,每行输出一个关键字及数量,格式为数量\t关键字

Java集合框架应用的分析:

这题使用的map类可以定义一个数组,由键和值组成,这个map里的功能有很多,可以通过keySet返回键,put新加键和值,这个的好处我感觉并不明显,我完全可以自己用一个类实现这些需要,运用map和运用自己所写的类也没什么区别。唯一让我学到的大概就是可以让字符串数组里的每个字符串和一个数字或其他的字符等东西相关联。

采坑心得:

这次的阶段性练习我采坑的地方并没有,要真说的话大概是对抽象类与数组的使用上,我现在也不算很清楚,主要是抽象类不能实例化,而在定义一个数组时,我如果把他定义成抽象类那个类型的数组,后面实例化的不也是一个抽象类的数组吗,这个时候我的java程序就报错了,感觉上确实不行,但是我自己运行了自己写的一个比较短的代码,也采用这样的思想,却运行成功了。没办法,我就把题目里的抽象类换回了实体类,我的心得就是在搞清楚一个问题之前,还是不断的自己用测试代码看看能不能实现,搞清楚之前还是使用原先的写法,不要强加抽象。

改进建议:

基础的java语法的学习差不多告一段落了,接下来要的就是不断更新对其中的概念的理解,争取做到会写代码也可以清晰的理清代码深层的联系,并不断改进和完善代码中不用类的关系。

总结:

通过这个阶段的联系,我新学会了聚合,继承,多态,接口的代码实现方法,并对这些概念有了一定的理解,还有对正则表达式的匹配有了更深一步的想法,运用了更多没想过的类,对数组的使用上也更加熟练了。

我认为老师教的方式挺好,可以边学边写,这门课程也没有想象中的困难,希望我以后可以学的很好,实验很好的加强了我的打代码能力,还有一定的趣味性,课上大家积极写题目,氛围很好,上课布置的课下小作业也有趣,比较贴近生活,不会让我感觉这门课枯燥无味,让我更有动力学习java。

posted @ 2021-11-13 23:39  还就那个肉蛋冲击  阅读(80)  评论(0)    收藏  举报