OO面向对象第二阶段总结

0.前言

本次博客是接着上次第一阶段的学习进行第二阶段的总结,主要讲述下第二阶段的学习情况,第二阶段主要学习的还是正则表达式的运用,其中,作业题目还是比较有难度。其中很多关于方法的层层调用,还有对象的创建与使用,构造方法的定义与使用方法,引用变量与对象实例的关系与区别,以及继承与多态的使用。

 

1.作业过程总结

主要是:三次作业的知识迭代关系,遇到的问题及解决方式,花费作业时间比例,对编程的一些认识及教训

 

第五次作业题目

                                                                

我认为这次作业的第一题7-1是第二阶段学习以来难度最大的一道题,7-1主要运用的还是正则表达式的使用,检测数据的输入规范性,但是要求的点较多,首先要以回车为标识,把一长串的字符串分为小的一句字符串,接着用正则根据不同的符号,如“/”, ”  “(空格), “:”,用split方法将数据分割,获得我们要求中需要的数据,再用正则匹配进行检验。

类设计提示如下:

 

扫描二维码关注公众号,回复: 11163707 查看本文章

类间数据的传递情况如下:

 

 

        同时在该题中用了StringBulider来输入字符串,其中的append方法可以在原输入的基础上添加代码,使得代码更加简介,同时不耗时,所用空间小;其substring方法方便我们对字符串的截取。这道题提示的类信息,很清晰的规划了每个类的原则,严格遵守了单一原则要求。

 

    这次作业的7-2题与离散中的知识有点结合,难度不大,主要是类的创建与使用,对于类创建的对象中还可以接着以类对象作为参数进行传递。

如:Rectangle rectangle = new Rectangle(new Coordinate(abscissa,ordinate),length,width);(对象中包含对象)

Co coord=new Co (rec.getCo ().getA ()+(rec.getW ())/2.0,rec.getCo ().getO ()-(rec.getW ())/2.0);

(创建对象来进行方法的调用)

 

7-3主要与继承有关,比如Rectangle,Circle,Triangle这些都具有图形有关的性质(边长,面积,周长),因此将这些共同点提取出来,即为父类(Shape)抽象类,其中的方法可以不必实现,而这些图形中也存在细小差别,有不同边的数量,有无高的情况,因此这些类可作为子类去继承Shape类,子类会继承(除private定义的方法,属性)其他方法与属性,子类继承父类时,必须实现父类中未实现的方法。且每个类中要有自己的构造函数(与类名同名),必要时,还须有自己的getter和setter方法。

 

第六次作业题目

                                                                         

该次作业7-1题与上次作业不同之处在于,本次使用了链表的概念来储存对象,同时要求输出图形面积排完序后的数据,如:

ArrayList<Shape> list=new ArrayList<Shape>();

利用链表的add方法来储存对象,这里的排序可以用comparator或者comparable对对象数组进行排序后输出,这里使用该接口排序的好处是可以根据对象不同的属性进行排序,这里7-1是用计算所得面积作为一个属性进行排序。

 

    而7-2多项式求导,与之前的检测水文信息题目类似,同时多使用正则表达式,检验每项是否合法输入,并计算得出求完导之后的式子,其类结构可分为:多项式类,常数项类,求导类,表达式类,拆分类。每个类有着不同的职责,此题难点还是正则表达式,以及字符串的截取,在“*”前面的是系数,在“^”后的为指数,可以根据substring,valueOf方法获取系数,指数,进行计算后输出,同时还有一些特殊情况要另外进行判断。

 

第七次作业题目

                                                                       

    此题也与前几次的图形继承有点相似,但是这里的不同在于两个链表,一个用来存整型图片数字(卡片上的数字对应着不同的图形),还有一个用来存储图形对象,要严格对应输入的顺序。

其中一个储存的方式如下:

 

储存卡片对应数字1,而该卡片对应圆类的对象

接着是输出的语句,图形面积要与图形名称对应,我是在不同类中重写了toString方法输出语句,如“Circle”+String.format(“%.2f”,getArea())

这是与圆类对应的toString输出方法。

 

     7-2题可以沿用部分7-1代码,但是需要将不同图形分组,把一个链表中的所有类依次分类,如圆链表,矩形链表,梯形链表,三角形链表。此处需要添加多个链表,并在已经分好组的中进行对同类图形的面积排序。

这里存储的对象的形式如下:

 

例子中是添加了一个ArrayList<Circle> cir=new ArrayList<Circle>()的链表,

其他的与此相似。在本题的最后还需找出各组中最大的面积之和,输出。

Comparable接口方法如下:

传入一个Student链表o,比较其score属性,排序是倒序还是顺序与if控制的“>”,“<”有关,之后输出就是已经排完序的相对应的对象。以上两题相似,都围绕类的继承,多态性使用方法以及接口的应用。

    附加题:7-3主要是优化算法,在规定时间内输出小于这个整数的所有素数及数量,这道题容易卡时间,减少循环、计算的次数,如可以先去掉所有的偶数,在将接下来的奇数开根号,可以减少计算量,减少运行的时间。

   

    总结来说:以上三次作业的难点主要还是正则表达式,构造方法的使用,以及引用类型参数过程,对象组合的方式与方法也是一个重点,如何使用自己已经做好的类,如何调用方法。通过查找自己需要的相关资料,比如:如何传递对象参数,先上网查找有关该知识,理解后,自己在eclipse上试自己想到的方法,这个过程或许会有报错,我们可以借助报错信息进行修改,eclipse也可以辅助,给我们提示需要哪部分,从而这样一步一步积累,就会形成自己的一个知识网。

     这三次花费时间大概是从多到少,第四次花了将近五六天时间,第五次也同样,都是卡在了正则表达式上,第三次较为简单,大概花了一天时间。这一阶段有难度的作业也让我认识到了,对象的重要性,将每个程序以不同功能划分类的职责,并且每个职责都是并要的。这些类可能有着相互依赖的关系,一环扣一环,一环出错可能会导致其他的类也出错。

在编程过程中要重点注意空指针的问题(①对象不存在,又调用了其方法;②访问,修改一个对象不存在的字段)这两种情况会产生异常。其次是方法的调用关系,有时不能一步调用到自己想要的方法,只能层层调用来获取,这个时候需注意类中方法的依赖关系,以及创建的对象可以调用哪些方法的问题,否则容易报空指针的错误。

      

2.OO设计心得

①面对对象三大技术特性之间关系的理解

使用在别的类中的方法时,需要先new出一个对象,该对象可根据情况带有参数或者不带参数,来进行调用,这是我认为的封装特性;而继承则是利用extends来使得子类拥有一个共同的父类特性;多态是传入很多的子类继承相同的父类,根据需要可重写父类方法或是直接使用父类的方法。

 

②面向对象设计的基本原则理解(单一原则,开-闭原则)

       这一阶段的题型都相应的给出了设计类的提示,严格的单一原则,如:拆分这一类,只负责多项式的拆分,可利用“-”,“+”把每项分开;而这一阶段也用到了很多“开-闭”原则,“开”是指允许子类重写父类的方法,“闭”是指子类直接继承使用父类的方法。

 

③OO编程思维的理解

       经过这一阶段的学习更加加深了对OO的理解,面向对象就是遇到某一问题时,将其当作一个对象,该对象有许多部分,可以经过一系列的继承,封装,多态来模拟行为解决问题。同时对象不仅具有行为,还有属性,如一只猫,其颜色就是其的属性,其作出的行为就是成员方法,而猫是我们创建出来的一个实例化具体的对象。

 

④类设计心得

       这几次作业基本没有自己对于类的思考,相应的指导书中给了相关类的提示,但是由于可能有部分类的功能较难实现,我会选择性的添加别的类,或者合并一些功能比较相似的类,同时使用private,protected,public等来限制类的访问权限,在类设计上尽可能使用能体现其职责的名称,不是所有的类中都需要getter和setter方法。

 

3.测试的理解与实践

①测试对于编码质量的重要性

       这几次作业要求的点十分细致,而通过不断测试,可以使我们发现自己的新问题,并进行改正,其中逻辑错误是很难找到的,因此还需要debug来看每步不同值的变化,抓住值的变化来进行修改代码,提高编码质量。

 

②查阅资料, Junit对于进行程序的测试情况

       其可以编写测试类,可以同时执行对个测试方法,而测试结果简介明了,安装也十分方便,找到libraries就可以将其导入出来,使用junit进行的程序测试也是可行的。

4.课程收获

总结这四周来在OO方面的教训及收获

       了解了类的声明、创建与使用,类的成员变量、成员方法与使用,Java中方法的重载与重写的区别:重载是方法名称相同,但参数列表不同,参数的数量或参数类型不能完全相同,而重写是方法名与参数列表都相同。逐步了解了引用变量、对象实例之间的关系与区别,以及对象组合的方式与方法。在编译与运行过程中所获得的错误信息有一定的修改能力,可以根据自己的需要变化不同的方法来达到同一个结果。会使用网上的工具对正则表达式进行检测,如:https://tool.oschina.net/regex/

 

5.对课程的建议

①第三阶段作业难度、题量的建议

       对于第三阶段的学习的话可以第二阶段难度差不多,也要有点难度,有难度的话,学到的东西才会多,而且对于自己的印象也比较深刻,题量的话可以选择一次三道题,难度递增,可以与第七次作业一样相似的题型,但是细看的话却有不同点,第二题在第一题的基础上有创新,运用了链表分组,在链表中排序,输出各组面积之和的最大值等新的要求。我认为这次的作业让我们易于接受,难度也不是很大。

 

②课程内容讲解方面的建议

       对于每个知识点可以运用一些简单例子对我们进行讲解,让我们更清晰该知识点的使用,同时可以让一些有自己想法的同学来讲解自己对于一道编程题的思考以及实现,让我们看到更多不同的实现方法,来拓展自己的知识面。

猜你喜欢

转载自www.cnblogs.com/paxlwssy/p/12782421.html