题目集4~6的总结性Blog

blog作业总结

 20201333-张柏明

(1)前言

       第二次写博客,第二次总结自己的不足,只有总结不足,才能有所收获。这次总结的内容主要是针对第二次作业中新的知识点,自己在编写代码时出现的报错,以及代码的复杂度,可是否有应用价值而展开的。

       以下是这三次作业大概的的知识点总结

作业 知识点
第四次作业 类的继承 类的聚合关系
类和类的方法的调用 正则表达式的应用
第五次作业 分割字符串的函数split 三种排序法(选择排序法、插入排序法、冒泡排序法)
List、Map、Set equals函数
类的聚合
第六次作业 正则表达式简单用法 toCharArray()将字符串转化为数组
继承与多态 ArrayList的用法
Arrays及Collections的简单应用 接口

       这三次作业的难度不是很大,但有很多新的知识点需要学习。比如List、Map、Set,正则表达式等。由于这三周的Java课程伴随着实验的学习,老师布置的作业题量也比较少。但每一次作业都有着它存在的意义,我们只有认真的对待了每一次作业,才能不断提高编程能力。

       题目集四和题目集五出现了两个关于日期聚合的问题,用不同的聚合方式实现了程序功能,但在程序的实用性和效率方面可能会存在差别,我们要分析哪种聚合方式更有用。题目集四,比较重要的知识点也就是子类继承父类吧,另外我们也对类的单一职责原则有了更深入的了解。

 (2)设计与分析

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

       先用报表生成两个题目两种聚合

 

        两种聚合设计方式不同,题目集4(7-2)中的聚合方式就像一个链条,一个类连着一个类,看上去每个类的独立性不高,年月日这三个类由于都有公共属性,所以在定义了年year中的value属性之后,在月这个类就中要加上Day型的day属性,在日这个类中Mongth型的month属性和Day型的day属性,由此在DateUtil类的方法中想要调用年月日这三个类中的方法时就得使借用月和日中的属性来完成,这样做可能会导致程序的执行效率不高,类和类之间的关联性较强,不太利于程序的复用。

1 public boolean checkInputValidity() {
2             if(day.validate()&&day.getMonth().validate()&&day.getMonth().getYear().validate()) {
3             return true;
4             }
5             return false;
6         
7         }

        if中的条件我们可以看出,年月日的合法性是如何来表示的因为DateUtil中就定义了Day型的day属性,所以用day.validate()表示日的合法性,用day.getMonth().validate()来表示月的合法性,用day.getMonth().getYear().validate()并表示年的输入合法性。通过以上代码我们发现,类与类之间的关联性非常的强,代码基本上就是一次性代码,很难复用,实际应用的可能性微乎其微。

        而第二次聚合实验的题目,与第一次聚合实验形成对比,让我们能写出可复用性更高的代码,执行效率会更高。三个类中均只有一个属性value,三个类均单独为类。而是把属性都定义到了类中DateUtil,在DateUtil类中能调用这三个类中的方法更加容易,类与类的的独立性更强,删除一个类也可以再加一个类,不用给程序做太大的改动。

 

class DateUtil{
          private Day day;
          private Month month;
          private Year year;
}

       像这样在DateUtil中定义这三个属性,年月日三个类中定义的类都是value,该种构造的聚合方法聚合更好,程序容易改动,而且效率会更高一些。

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

       题目集4(7-3)是一个图形继承的题目,这个题目就相对来说比较基础,除了主类之外又定义了五个类,一个父类Shape,还有三个子类Circle,Rectangle,Ball,Box。Circle和Rectangle继承Shape,而Ball继承Circle,Box继承Rectangle。因为父类都拥有公共属性,所以子类可以做出省略。

 

         通过以上类图可以看出类的继承关系,在class Ball中就没有定义属性,因为在Circle类中就已经定义好了半径,球需要求体积的因素也就是一个半径,因此在继承的类中便不需要再定义其它的属性了。而像Box类中除了长方形中的长宽以外还要定义高,因此要再定义一个属性

private double height;

在这个题目代码中所有的类中定义的属性都为私有,封装性强。

       题目集6(7-5)是一个图形继承和多态的问题,相较于继承,该题增加了一个多态的知识点,多态中的一个典型特点就是重写(@Override)方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法,就称为重写。重写是进一步对子类的完善。一般在子类中写不同的方法时会用到重写。同样的,这个题也用到了类的继承,继承对象同样是图形求面积。使图形继承的代码更为高级,多态可以让程序提高了代码的维护性,可以提高了代码的可拓展性,把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。

 

        我之前对这个多态没有什么太多的概念,不知道这个图形继承的题用多态和不用多态有什么区别。后来这两道题对比而来可以看出,使用多态和不使用多态程序结构上是有很大区别的。当子类中出现与父类中一模一样的方法声明,就称之为方法覆盖,即方法重写。该Shape类为抽象的里面求面积的方法也定义为抽象的abstract double getArea();因此在继承的子类中想要求各自图形的面积就需要重写方法。

 

 

 

 

        题目集6(7-5、7-6)实现图形接口及多态性,运用到的技术是接口及多态,接口就像是一个抽象类。

 

       在这个程序中,GetArea就是接口,接口中的getArea()方法是求面积的,写好的接口如下

1 interface GetArea {
2     public abstract double getArea();
3 }

       而类似于子类继承父类,接口的继承是非常巧妙的,接口类似于抽象类,接口中定义一个抽象的方法public abstract double getArea();接口中就这一个方法,class Circle implements GetArea,class Rectangle implements GetArea两个类继承接口,在这两个类中再写getArea()方法。

       在主类的主方法中再创建一个对象,创建一个接口的对象,实现形式如其中GetArea为接口,而Rectangle(x,y)为实现接口的类。同理,实现接口的类还有一个Circle(r),通过接口可以调用实现接口的类中的方法。调用类中求面积的方法,代码如下图所示。

 1 public class Main {
 2     public static void main(String[] args) {
 3         Scanner in=new Scanner(System.in);
 4         double r=in.nextDouble();
 5         double x=in.nextDouble();
 6         double y=in.nextDouble();
 7         GetArea area2=new  Rectangle(x,y);
 8         GetArea area=new Circle(r);
 9         if(r<=0||x<=0||y<=0)
10             System.out.println("Wrong Format");
11         else 
12         {
13         DecimalFormat df = new DecimalFormat("#0.00");
14         DecimalFormat d = new DecimalFormat("#0.00");
15         System.out.println(df.format(area.getArea()));
16         System.out.println(d.format(area2.getArea()));
17         }
18         
19         
20     }

        接口的优点是多方面的,接口能够让代码更规范,可以给开发人员更清晰的指示,一个接口可以去实现一系列的功能。而且接口可以加强代码的可维护性,当程序需要改变的时候,可以做到只改变一个类而不改变接口。

 

 

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

      正则表达式是Java中的一种常用手段,接下来我将对这三次作业中所用到的关于正则表达式的问题作出分析总结。

先从简单说起

     正则表达式训练-QQ号校验

 要求:要求必须是 5-15 位;0 不能开头;必须都是数字;简单的正则表达式处理,控制位数的范围,保证开头数字的数值。

String pattern = "^[1-9]{5,15}$";

     正则表达式训练-验证码校验 

要求:接受给定的字符串,判断该字符串是否属于验证码。验证码是由四位数字或者字母(包含大小写)组成的字符串。在这个正则表达式中应该筛选出输入为四位的,并且只存在字母和数字的验证码。

String pattern = "^[a-z0-9A-Z]{4}$";

     正则表达式训练-学号校验

要求:对软件学院2020级同学学号进行校验,学号共八位,规则如下:1、2位:入学年份后两位,例如20年,3、4位:学院代码,软件学院代码为20,5位:方向代码,例如1为软件工程,7为物联网,6位:班级序号,7、8位:学号(序号)。该题目的要求是对不同位数号码均有限制,正则表达式用于分段式字符串检测。

String pattern ="^2020[1[1-7]|6[1]|7[1-3]|8[1-2]][01-40]{8}$";

      统计Java程序中关键词的出现次数

这个程序,需要正则表达式来筛选关键字,并将关键字存入数组中。

String [] gjz ={ "abstract","assert","boolean","break","byte","case","catch",
                 "char","class","const","continue","default","do","double","else",
                 "enum","extends","false","final","finally","float",
                 "for","goto","if","implements","import","instanceof",
                 "int","interface","long","native","new","null","package",
                 "private","protected","public","return","short","static",
                 "strictfp","super","switch","synchronized","this","throw",
                 "throws","transient","true","try","void","volatile","while"};

       水文数据校验及处理

以下正则表达式用于实现合法性的检验,四个|为分隔。

".*[|].*[|].*[|].*[|].*"//校验输入格式合法
"([1-9]([0-9]{1,3})/(([13578]/(([4-9])|([1-2])([0-9]?)|[3][0-1]?))|([2]/(([3-9])|([1-2])([0-9]?)|([1-2])([0-8]?)))|([469]/(([4-9])|([1-2])([0-9]?)|[3][0]?))|([1][0]/(([4-9])|([1-2])([0-9]?)|[3][0-1]?))|([1][2]/(([4-9])|([1-2])([0-9]?)|[3][0-1]?))|([1][1]/((([4-9])|[1-2])([0-9]?)|[3][0]?)))) (([1]{1}[02468])|(2[024])|([0]|[2]|[4]|[6]|[8])):00"
//检验输入格式合法

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

 

 

       这个题用到了正则表达式,这个代码都是在Main类中实现的,比较简单。

 

1 String [] gjz ={ "abstract","assert","boolean","break","byte","case","catch",
2                  "char","class","const","continue","default","do","double","else",
3                  "enum","extends","false","final","finally","float",
4                  "for","goto","if","implements","import","instanceof",
5                  "int","interface","long","native","new","null","package",
6                  "private","protected","public","return","short","static",
7                  "strictfp","super","switch","synchronized","this","throw",
8                  "throws","transient","true","try","void","volatile","while"};

       挑出关键字,筛选关键字,将关键字存入数组中,用ArrayList存储,可以增添或删除元素。通过使用正则表达式和循环遍历数组将关键字找出,并且选择出数量并排序。

(3)采坑心得


        7-6 实现图形接口及多态性,这个题在测试数据时与题目所给出的样例没有区别,输出结果也正确,但提交的时候就是不得分,当时记得是有一个无效边界测试的点过不了,还有一个就是正常数值的也过不了,题目所给出的测试点如下图所示

 

 

       我自己的代码和题目给出的样例输出是一样的,但提交时就是正常测试的点总是过不了。后来在询问同学之后发现我把圆的输入半径r定义为了整型,还是应该定义成double型,输出结果是double型,为了使代码更严谨,输入也要定义成double型。

        还有,就是学习接口的时候,接口不是很会用,接口创建对象,包括如何用接口来实现接口都是我在编写代码时我所遇到的问题。整个代码还是有很多报错,包括上网查阅资料,一点一点总结问题,最终学会实现接口,用接口创建对象。

 

(4)改进建议


        关于代码的改进,我想说一下7-5 图形继承与多态,这个题,主要把太多的经历放在了主方法中,如何去对数据进行排序等方面去了,明显能感觉到代码的头重脚轻。这样的代码是没有什么效率的的,可以说复用率很低。我想到的改进方法是再写一个类,从而减轻Main类的Main方法的压力,通过再写的这个类,实现将所求面积的种类,个数,以及面积大小的排序。最后再在主函数中打印,从而提高代码的可维护性。

        还有关于日期类的聚合,我们已经写了两种完全不同的代码,第五次作业所写的代码,相较于第四次作业写的那个代码,可维护性提高了不少,聚合方式也有了很大的改变,也就是我们所说的可复用性。

        图形继承,该题父类功能太单一,仅仅是一个求面积的方法,子类只有和父类相同的功能时,才能实现对应功能。在这种情况下可能使用类的接口时会更好一些,接口在符合规则的前提下,其他的功能子类都可调用到接口中同名的功能方法,接口中的抽象方法都得以实现,且多个无关的类可以实现同一个接口,一个类可以实现多个无关的接口。因为接口的属性和抽象方法默认是必须公开的所以如果有需要保护私有的的属性或者方法时,必须用继承一个类。

 (5)总结

       第二次总结PTA的作业,与第一次总结不同的是自己的心态。第一次总结作业,内心总是充满了不安,好多好多的专业术语不理解,在写程序的时候查阅的资料什么的也都是通过实例去实践。而很多东西自己知道的或是自己不知道的都不怎么清楚,基本上脑子里像是一团糨糊,对自己的定位还是不够。

       这三次作业使我们加深了对正则表达式的理解,学会了继承接口和多态方面的知识,通过实践不断提升自己,相信未来一定能提升很多。

        又有了一个月的练习,自己的编程思维正在快速建立,只是经常自己的编写代码的能力不够,无法实现自己的思路。包括平时的作业,很多题目的创作来源于同学的讲解。因此,要想提高编程能力,还需要自身更多的努力,更多的去编写代码,自己揣摩琢磨。

        通过不断的学习,我们更多的了解到Java对我们软件开发人员的重要性,之前总会有同学纠结于Java的运行速度慢,就单纯的认为Java的效率低,认为Java不如C语言或c++,但听到老师的讲解之后,更多的改变了我们之前对Java的看法,Java的可维护性高,复用性强的特点总会让我们收益,以后在编程的过程中,我们会发现Java可以为我们节省很多的时间,我们经常可以使用之前用过的代码,进行加工并复用。

posted @ 2021-04-29 16:45  zbm123  阅读(115)  评论(0)    收藏  举报