Java作业的第二次总结
0.前言
针对我们第二阶段的作业(共三次:pta中的作业)发表总结性博客。
1.作业过程总结
作业练习心得体会:第一阶段的学习让我知道怎么样从面向对象向面向过程过渡,而第二阶段让我更加深刻的理解面向对象的知识面最主要的是包括:通过作业逐步理解面向对象的封装性、继承性与多态性三大技术特性。
①第四次的作业真的让人头大(水文校验的题目)一开始根本不怎么怎么做,怎么输入,怎么样的思路,基本上不清楚,后来在其他同学的指导下,了解到我的知识盲区分割组合,但是我根本从来没有接触过,这个时候就只能自己慢慢的百度学习,其实让我在这一次作业收获的应该就是分割和组合。组合成用:StringBuilder,分割用:split。第二题的关键在于求随机数,一定区域的随机数主要的代码如下:
随机的点的横坐标 x = Math.random()*((coordinate.getAbscissa()+rectangle.getWidth())-(coordinate.getAbscissa()))-Math.abs(coordinate.getAbscissa());
随机的点的纵坐标 y= Math.random()*(coordinate.getOrdinate()-(coordinate.getOrdinate()-rectangle.getWidth()))-Math.abs((coordinate.getOrdinate()-rectangle.getWidth()));。
第三题的代码主要是对继承的简单运用继承的知识点(图形继承)。总的来说这一次的作业就是牵引着我向我的“盲区”进军。同时这一次作业让我对第一阶段的面向对象有了更加熟悉的认识和可以融会贯通运用了。这主要体现在封装性和继承性上,当你修改一个错误去实现代码,而对那些调用代码的程序片段是根本不会有影响的,这就是面向对象的好处,如果是面向过程就有可能导致牵一发而动全身,同时如果程序出现好多重复的代码,那么代码显得太长,这时候继承带来很多的好处,子类继承父类的方法,而父类的支持方法不会减少,但是子类也可以进一步扩充属于自己的属性和方法。这使得程序的可读性增加。
②第五次的作业的第一题是图形继承与多态的题目,这一次作业相当于对第四次作业的第三题进行知识点的巩固和理解,但是有一点这一次出现了新的知识点:抽象类。但是总体上来说基本上就是知识点的巩固与提高。这一次的任务点在于对图形对象进行排序,而不能直接对图形面积进行排序,这也是之前没有了解的知识点,所以又让我在这一次作业中储备了相关方面的知识。第二题是关于一元多项式的求导这一次的作业也可以说是对前面一次的第一题进行知识点的巩固,因为也运用到了分割,同时这也是继承与多态的简单运用的一个小题,多态的作用好多灵活性、可替换性和简化性等,这让代码更简洁明了。总的来说,这一次还是对面向对象的封装性、继承性与多态性三大技术特性的用。
③第六次的作业是我有史以来做的最快的一次,半天就完成了,因为有了前面知识点的然后题目也不是特别的难,所以就写的快。所以当对知识点练的多了,我们就会更好对知识点的运用,所以多练的好处还是有好多的。
作业过程中遇到的问题及解决方法:①第四次作业的问题主要在第一题和第二题:第一题的问题比较多一开始就是如何串把数据起来,后来百度stringBulider的用法,写出了如下代码:
StringBuilder sb = new StringBuilder();
sb.append(b);
sb.append("\r");
sb.toString();
do{
b=input.nextLine();
sb.append(b);
sb.append("\r");
}while(b.matches(a)==false);
第二个问题在与空格的问题。后来上课的时候评论一直说用trim(),后来解决问题;第三个问题在于正则表达式不会写,后来慢慢的琢磨了半天,终于写出来了(特别长):String judage = "^((([1-9]\\d{0,3})/((([13578]|1[2])/([1-9]|[12][0-9]|3[1]))|((0[469]|11)/([1-9]|[12][0-9]|30))|(2/([1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})([48]|[2468][048]|[13579][26])|(([48]|[2468][048]|[3579][26])00))/2/29))\\s(([02468])|([1][02468])|([2][024]))\\:[0]{2}$";。
但是有一个测试点怎么样都过不去那就是“每一列都有错误”就是怎么样都不过去,最后我放弃了,即使我的代码运行正确,但是就是过不去。第二题的问题在于一定区域的随机数的求法,一直有点错误,然后我重新开了一个测试的代码,看看到底是哪里错误,后来就写出主要的代码如下解决问题:

②第五次作业的问题:第一题的主要问题在于对图形对象的排序不知道如何是好,然后百度学习到继承的相关知识,把其他的都作为shape的类,然后用一句代码:list.sort((Shapef s1,Shapef s2) -> s1.getArea() - s2.getArea() > 0 ? 1 : -1);进行了排序。第二题的问题在与不知道如何分解,后来用replace的方法解决问题:

最后根据加号分割成单项,第二个问题在于答整数型,这一次的代码不能出现int,最好都用BigInteger,因为如果数字太大就会超过int的数据范围,所以应该使用BigInteger他的范围大。一开始我使用的就是int,报错了,后来改成BigInteger就解决了。
③第六次作业的问题:第一题和第二题基本上差不多,问题也就差不多,排序的问题,我不能直接使用Collections.sort(cardList);后来发现是没有加implements Comparable<Card>,后来加上去就解决问题了。第三题就是算法的优化,但是最容易超时,一开始我一个一个来就超时了,后来分析了一下,将一个一个的判断改成:
总的来说:一部分是自己的粗心导致的,一部分是因为知识点的盲区。
每次作业花费的时间比例:第四次作业的问题:第五次作业的问题:第六次作业的问题=6:2:1
时间分析:第四次的作业关键在于测试点过不去,最终选择放弃(还有一个测试点改了一天还是过不去),所以花的时间比较久,第五次作业在于第二题的分割不知道如何将多项式分成一个一个单项,当时花了好多时间想,所以就花掉了好多时间,第六次作业在于前面知识点的基础上同时也不难,所以就花费的时间短。
对编程过程的严谨性的认识及教训:第六次作业没有加排序的哪一部分,然后就找了好久,一直在那浪费时间,每次基本上都不是我自己找到的,即使我自己检查多少次最后都一样的结果(找不到)。如果我可以严谨一点,这样就不会浪费太多的时间在找错误了。可能是因为知识点不清楚,一个好的代码会让代码的实用性增加,更加简洁易懂,所以在后续的学习中要对重视自己的代码编程中的严谨性。不仅可以节约时间,也可以让自己的代码是实用性增加。
2.OO设计心得
面向对象三大技术特性之间关系的理解:封装和继承目的是代码重用,而多态目的是接口重用。
封装就是类可以把自己的属性和方法藏起来,不容易让外界改变自己的值; 继承就是子类包含父类的属性和方法,但是子类不仅包含父类的属性和方法,他可以派生出自己特有的属性和方法;多态的作用有多灵活性、可替换性和简化性等,这让代码更简洁明了,同时也不必编写每一子类的功能调用,可以直接把不同子类当父类看,屏蔽子类间的差异,提高代码的通用率,目前学到多态的重写方法(override)。
面向对象设计的基本原则理解(单一职责原则及“开-闭”原则):
单一职责原则:每个类都应该有自己的单一的功能,并且该功能应该由这个类封装起来,同时这个类应该只有一个引起它变化的原因那就是他自己本身代码的修改,他的修改不会对其他的类造成影响。
“开-闭”原则就是:每个类应当对扩展进行开放,对修改进行关闭。其他的修改对他并没有什么影响,但是其他的类是可以使用他的功能和属性。
OO编程思维的理解:我觉得oo编程的思维还是(第一次的理解也是这样)在于类和对象的理解,只不过这一次的对类的特性的理解上升了,类的特性包含封装性、继承性与多态性三大技术特性。着同样是类和对象的方式去提高代码的实用性,层层递进去解决编程过程中所需要的问题。
类设计心得:类的原则包括单一职责原则及“开-闭”原则。同时类是面向对象最关键的一种属性,如果没有类的定义,就不会有面向对象的存在。类不仅可以升高实用性,也可以对代码进行简化。
3.测试的理解与实践
测试对于编码质量的重要性:测试可以验证编程的代码的正确性和实用性,如果没有测试,那么写的代码可能欠缺很多,这样的实用性差,可能在某个范围内,代码是可读的但是特殊案例就不可读,这样如果有测试我们就会让优化代码,让代码的质量提升,实用性和利用率提高,所以测试对于编程的质量起决定性的作用。
查阅资料,假设使用Junit进行程序的测试是否可行:可行,JUnit是一个Java语言的单元测试框架,它有它自己的JUnit扩展生态圈。多数Java的开发环境都已经集成了JUnit作为单元测试的工具。同时junit就是别人写好的单元测试框架,使用此框架可以大大缩短代码的测试时间和准确度。
4.课程收获
总结这四周来在OO方面的教训及收获:我觉得这四周来关键的地方在于对类的深层认识和对类性质的运用(封装,继承,多态)。还有对UML图的更深的理解了,看得懂UML图之间的关系和运用,但是自己设计UML图还是不行,得继续努力。
5.对课程的建议
第三阶段作业难度、题量的建议:感觉比第六次作业的难度稍微大一点,但是不宜太大,毕竟我的编程能力有待提高,如果太大根本不会写,也没有用,如果太小没有提升也不行,所以适当提高.
课程内容讲解方面的建议:感觉老师现在的教学方法挺好的,如果偏要有一个建议,那就是平时多出一点基础题让我们练练自己的编程能力。
浙公网安备 33010602011771号