第二次博客作业
前言
题目集4:
本次题目集涉及到正则表达式的应用,如何实现继承。
题目数量偏少但是难度较大。因为涉及到了重要的继承关系,要从之前的写代码的逻辑中跳出来,需要多运用继承解决问题。
题目集5:
本次的题目集涉及到了排序问题,可以用“Arrays”,也可以运用三种排序方法,也涉及到了继承的使用,其中7-5与题目集4中的7-2的题目需求相似。
题目数量中等,难度也适中,其中7-4的难度偏大。
题目集6:
本次题目集主要涉及到了对正则表达式的考查,对继承和多态的考察,在7-6中涉及到了对接口新知识点的考察。
题目数量中等,刚开始学习正则表达式时会有难度,但是在了解正则如何使用后,会发现这考察的是比较基础的正则表达式的知识。接口宇继承中的重写比较相似。
设计与分析
① 题目集4(7-2)
根据类图可知:
DateUtil 与 Day 是聚合关系,Day类 与 Month类 是聚合关系 ,Month类 与 Year 类是聚合关系 , Main类 依赖 DateUtil 实现, 其中 DateUtil只和Day类有聚合关系,Year只和Month类有关系,Day类与DateUtil和Month两个类有聚合关系。

题目集5(7-5)

根据类图可知:
DateUtill 类分别与Day类,Year类,Month类三个类有聚合关系,而Day类,Year类,Month类,只和DateUtill类有聚合关系,三个类之间没有聚合关系。
两者的优劣比较:
题目集5中将题目中提到的三个类彼此分开,各自执行自己的功能,通过DateUtil类进行联系,每个类的分工明确,Main类只需要直接与DateUtil类之间有依赖关系就可以了。
当要求求下N天,前N天时,以及两个日期之间相隔的天数时,三个类会各自实现变化,通过DateUtil传给Main类。 题目集5 中还将Day的 判断日期输入合理性 也放入了DateUtil类中。
题目集4中将题目中所需的三个类彼此相互串联起来,前一个类与后一个类是聚合关系,当前面的类满足后一个类函数所要求的变化时,可以直接实现变化,当要求求下N天,前N天时,以及两个日期之间相隔的天数时,会将这一个类图从头开始实现一遍。
两个题目集中的差异主要是类对于DateUtil类的传数据的方式不同,题目集5 的传导方式更加便捷,题目集4 的传导方式相比较于题目集5 会有些复杂。但是题目集4 中的三个类之间的变换联系相比较于题目集5 更加的紧密,但是如果题目集4中的函数需要变动时,需要将三个类中的函数改变一下,类的独立性相比较之下就没有题目集5 的完整,题目集5 中的函数需要变动时只需要将各自负责的部分修改完,在检查报错中也是同样的道理。
②题目集4(7-3)
类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类时Circle类 和Rectangle类的父类,Circle类是Ball类的父类,Rectangle类是Box类的父类
因为 “每个类均有构造方法,且构造方法内必须输出如下内容:Constructing 类名”
所以
public Circle() {
System.out.println("Constructing Circle");
}
其它四个类类似于这种,这样每构造一个类就会有输出相应的图形介绍,并且根据题目要求求出相应的面积或者体积。

为了实现继承,需要使用 extends 关键字,申明子类继承父类。但是需要注意,子类并不能继承父类的私有属性 private 的变量。
Circle、Rectangle、Ball、Box类均被要求重写从父类继承来的求面积的方法,需要运用 super 关键及,以及重写的方法名字要与父类的方法名字完全一致,否则会报错。最好在重写的地方加上标注“@Override”便于写完代码后的检查。
题目集6(7-5)图形的继承和多态
https://images.ptausercontent.com/3df4fd25-4579-40d6-9bbf-e8928c97ec02.pdf
阅读完题目后,因为有Circle、Rectangle、Triangle 三个对象,所以会首先想到创建三个不同的类,在各自的类中实现各自的功能,并且在各自的类中判断输入是否符合规则,在主函数中实现从键盘输入。 题目中要求将图形根据面积排序,通过数组可以实现,将图形的面积保存在数组中。
代码需要通过继承来实现,需要使用extends 关键字。为了将图形面积排序,需要运用数组的排序java.util.Arrays包来实现。

继承使一个子类能继承父类的特征,并且可以附加一些新的内容。子类是它的父类的特殊化,每个子类的实例都是其父类的实例,但是反过来却不成立,但是可以运用多态实现,简单的来说,多态意味着父类型的变量可以引用子类型的对象。,多态是一个类创建多个对象。
题目集6(7-6)实现图形接口及多态性
编写程序,使用接口及类实现多态性,类图结构如下所示:

其中:
GetArea为一个接口,无属性,只有一个GetArea(求面积)的抽象方法;
Circle及Rectangle分别为圆类及矩形类,分别实现GetArea接口
在Main类的主方法中分别定义一个圆类对象及矩形类对象(其属性值由键盘输入),使用接口的引用分别调用圆类对象及矩形类对象的求面积的方法,直接输出两个图形的面积值。
题目中明确提到了要求使用接口实现,接口的使用和抽象类的使用基本类似,但是定义一个接口与定义一个抽象类有所不同,接口所有变量必须是public static final,并且接口没有构造方法,接口不能用new操作符实例化,接口中可以包含public的抽象实例方法、public的默认方法以及public的静态方法。Java中只允许为类的继承做单一继承,但是允许接口做多重继承。利用 interface 可以继承一个接口,利用关键字extends,接口就可以继承其他接口。
类实现接口时,必须要将接口中抽象的方法重写一次。。
③正则表达式的分析总结
正则表达式是一个字符串,用来描述匹配一个字符串集合的模式。对于字符串处理来说,正则表达式是一个强大的工具。可以使用正则表达式来匹配、替换和拆分字符串。
题目集6中的前四题,均是要求使用正则表达式运算。在正则表达式中,判断输入是否合理使用matches关键字进行判断,使用matches关键字要有返回true或者false。
通过正则表达式会使题目的处理变得简单,只需要输入一串字符串就可以解决输入的正确判断。
String number = in.nextLine();
String trueNumber = "[2020][11-17_61_71-73_81-82]{2}[01-40]{2}";
boolean flag = number.matches(trueNumber);
if(flag)
System.out.println("正确");
else
System.out.println("错误");
类似于题目集6中7-4中判断学号的输入是否正确就可以按照上面的代码进行输入。
但是正则法则中中括号中的数字范围只能是0-9 。因为在正则表达式中中括号中代表的是字符串,并不是数字。如果需要判断的范围中包括数字和字母的可以[0-9A-Za-z]包含了判断是不是数字或者大小写字母,而不是其它符号,如果需要几位可以使用{},中间加上需要的位数。像题目集6中的7-3中要求验证验证码的正确性
String trueNumber = "[0-9a-zA-Z]{4}";
要求验证是不是4位数,就在中括号中加上4。
踩坑心得
1、在写这三次大作业中给我最明显的感觉是,我的思路不够清晰。 像题目集6中的7-5,在最后的各个图形面积排序的方法中,我在最开始的时候没有想到数组就开始写题,当最后实施到那一步的时候,发现自己原本的思路无法实现,在最后才想起来要用数组储存每一次图形的面积,导致了我将前面的代码也改了许多,导致代码过于啰嗦。
2、在我看到的一些优秀代码中,他们的类中,除了主函数中,其他的类中几乎没有输出,他们将最后的输出全部放入到主函数中。
3、在我用到像public int/float等一些数值型的方法中,在之前一直不知道怎么将return 的数值输出,要在方法的前面用get和set的方法,申明this.n(变量)= n;然后再在输出的话才可以输出。
4、正则表达式中【】中的数字范围只能是0-9,其实中括号中的不能算是数字,只能算是字符,刚开始写的时候以为是数字,但是如果是数字的话,里面就不会有其它字母的。字母或者数字的判断不分先后。
5、写类时要多注意使用get和set的方法,会使代码变得更加的符合规则。
改进建议
希望在题目中给出的引导性的语句可以增加一点,就是对这些题目应该如何切入的思路。
总结
1、写类时要多注意使用get和set的方法,会使代码变得更加的符合规则
2、在我看到的一些优秀代码中,他们的类中,除了主函数中,其他的类中几乎没有输出,他们将最后的输出全部放入到主函数中。
3、写代码时要注重逻辑,不然最后检查的时候也不好检查。
double radius = 0; double width = 0; double length = 0; double s1 = 0; double s2 = 0; double s3 = 0; double q = 0; int i = 0; int j = 0; int m = 0; int z =0; int x = 0; double sumArea = 0; double sumOfC = 0; double sumOfR = 0; double sumOfT = 0; int flag = 0; int numberOfCircle = in.nextInt(); int numberOfRectangle = in.nextInt(); int numberOfT = in.nextInt(); if(numberOfRectangle<0||numberOfCircle<0||numberOfT<0) { System.out.println("Wrong Format"); } else { double[] c = new double[numberOfCircle]; double[] c1 = new double[numberOfCircle]; double[] r =new double[numberOfRectangle]; double[] r1 = new double[numberOfRectangle]; double[] r2 = new double[numberOfRectangle]; double[] t = new double[numberOfT]; double[] t1 = new double[numberOfT]; double[] t2 = new double[numberOfT]; double[] t3 =new double[numberOfT]; double[] sizes = new double[3]; if(numberOfCircle==0) x++; if(numberOfRectangle == 0) x++; if(numberOfT == 0) x++; double[] area = new double[numberOfCircle+numberOfRectangle+numberOfT+x];
这样的代码在后面的作业中要注意改进
浙公网安备 33010602011771号