Java学习第二阶段小结

  Java课程第二阶段的学习结束了。这一阶段的学习有一些吃力,难度突然加大了很多,起初十分不适应,后面的学习过程中才逐渐掌握了节奏。通过这一阶段的学习,基本了解掌握了面向对象的封装性、继承性和多态性的技术特征。接下来,对此阶段的作业做出一个阶段性小结。

1、 作业过程总结

第一次作业:此次作业分成三道题目。分别是:水文数据校验及处理、蒙特卡罗方法求圆周率、图形继承。难度形成很明显的梯度。第一题难度最大。私以为最大的难度在于理解题意。

从这里也能意识到,如果项目的初衷,要求都弄不明白,一切后续工作都是徒劳。

第三题难度最低,是接下来几次作业的基础,是一个图形的继承问题。由子类Circle、rectangle、ball、box继承自shape父类来实现求图形面积以及体积。由于是接触java继承的第一题,所以难度并不是很大。

第二题蒙特卡罗方法求圆周率。初见这道题,,像被锤子砸了额头,很懵,一头雾水。丝毫不能理解蒙特卡罗方法是什么。但是仔细读题,并且通过搜索引擎查找蒙特卡洛思想发现,实际上是通过概率仿面积。知道了这个,则要完成随机数。随机生成数字(已规定界限),通过比例来表示圆周率。我们的实现是非常简单的,但是这里也体现了数学在实际生活中的应用。跨学科的题目综合性更强,更令人回味。

第一题是令人无比头疼的水文数据校验及处理。刚接触到这道题目,不知从何下手。上个学期的C语言,虽然期末考试成绩较为理想,但是对字符串的理解与掌握只是一点皮毛。这个弊端在JAVA上被无限放大。自学JAVA中的字符串处理,让我意识到,自己并不是什么天赋型选手,一切都要以靠自己的努力来实现。自学了一些相关操作后,开始着手处理这道题目。先是切割字符串。将输入的信息进行切割,置于数组中,传入不同的系统。经过了许多问题的挑战,迎来了最大的难点——正则表达式校验。虽然自学了一些正则表达式的知识,也看了网络上的一些视频讲解正则表达式,但是真正到了自己实际操作时,发现难度比想象中的大。即使按照格式写出来了,也会发现括号不对称的问题(正则表达式中的括号非常多),导致作业完成的滞后还是发现在草稿纸上手写更有效率,因为这种传统的方式,让人更容易冷静下来思考问题。自认为差不多就继续进行下一项工作使得我在测试点的方面吃了很大的亏。待我修改了许多次之后,运行突然报错了。原来正则表达式中的一个符号被我多加了转义字符,导致无法正确编译,大大耗费了时间与精力。

第一次作业耗时一个星期。是学习JAVA开始耗时最长的一次,也因为自己的自觉性不高,不能一有空闲就沉静下来完成作业(拖延)。此次作业给人当头一棒,有一些被正则表达式的问题吓住了。

第二次作业:第二次作业有两道题目:图形继承与多态、一元多项式求导。第一题与上一周的作业之间有迭代关系。增加了一项将输入的图形面积排序。难度大了不少。第二题多项式求导难度非常大,私以为难度较第一周的水文数据校验与处理难度还要大。也用到了正则表达式。

第一题:根据上一周的内容,与图形相关的类的结构是完全一致的。所求在于主函数,如何用户控制得到相应的图形面积,并将排序前的数据打印出来。再进行排序,将排序后的数据打印出来。于此,我将输入的数字存入不同的数组中,不同的数组对应不同的内容,以实现不同的面积求法。但是对于继承与多态的认识不够深刻,我在参数调用的尝试中多次碰壁。最后虽然得以解决,但是大量的耗费了时间与精力。

第二题:一元多项式求导。这道题我认为是截至目前,题目难度最大的。首先是多项式的截取。由于有不同的情况,所以分割变得困难了起来。想要实现将多项式的每一项都分割出来,就需要考虑到不同的情况。这道题中的正则表达式我一共提供了6种不同的情况,思维量比较大。与老师给出的类图不同,我认为常数项的求导是0,所以没有必要将常数项的值也放到求导的方法中去返回一个0,于是我取消了常数项为0的返回值。不过这样,我陷入了一个参数调用的死循环。传入的数据没有数据传出,无法响应。这个问题使我大为苦恼。一元多项式求导放在数学中是非常基础,非常简单的内容。但是用编程语言将其实现并非一件简单的事情。但是事实上,我们明白。数学领域的发现难度,远比代码实现要难得多。这表示其实我们对Java的掌握程度远远不够。不止是Java,是编程思想的理解问题大。

此次作业耗时整整一周,在deadline的下午才完成。或许deadline才是第一生产力这句话就是用来讽刺这种平时懈怠的人。如果打从一开始就正确认识到错误,抓紧时间,就不会陷入deadline的窘境了。

第三次作业:第三次作业有三题,合计130分。最后一题为加分题,十分有趣。

第一题:图形卡片排序游戏。其实这道题目与前两次作业中出现的图形继承与多态关联十分紧密。但是写代码时,并没有意识到。所以还是一个字一个字的去码。这提示我们,适时灵活巧变。实际上,日常的工作中,许多代码的编写都是重复的。常听到人戏谑,程序员的一生,就是作为搬运工的一生,仔细想来,确实有道理。不过自己手动编写可以增强一定的编程能力,更加熟练的运用所学东西到的东西。这一题中使用了comparable接口中的compareTo方法,使题目要求中的排序更加快捷简便。

第二题是图形卡片分组游戏。与第一题如出一辙,所以直接在第一题的源码中进行修改。在进行修改时,首先应该思考的问题,如何将对应的图形分离(separated),进行了一番思考之后,我决定将第一题代码中的几个方法添加参数。通过传入的参数使用switch case方法,将不同的图形存入不同的ArrayList中去。这样使得代码更加井然有序。

第三题:第三题十分有趣,求素数。其实求素数在C语言中是一个非常基础的问题。不过C语言刚刚入门的我们,只要考虑到实现就行了。但是现在的我们,怎么也是百尺竿头更进一步了,需要考虑到效率问题。一开始我在C语言所使用的遍历方法中开了一个根号,这样可以提高一定的效率。但是这样是远远不够的。于是我去了解了找素数的另一种方法——筛法。起初我使用的是埃拉托斯特尼(Eratosthenes)筛法,其核心思路是要得到自然数n以内的全部素数,必须把不大于n的所有素数的倍数剔除,剩下的就是素数。这种方法效率很高。然而我在网络上了解到了在剔除非素数是,有些合数会重复赋值,这样就降低了效率。于是了解到了线性筛(欧拉筛法)。其可以将每一个合数拆成2与最大因数的乘积,这样大大提升了效率。在求素数的过程中,学习到了数学的思想。虽然这些思想都是前人已经提出来的,但是这也让人见识到了思维的发展。人的思维有无数可能,未来有无穷的光亮。

第三次作业,吸取了前两次的教训,提前动笔,尽早地完成,使得自己一身轻松,不用担惊受怕,这才是最健康的,最积极的学习方式。

2、 OO设计心得

面向对象三大技术特性——封装性、继承性、多态性。事实上,继承性是基于封装性的,多态性是根据继承性进行优化的。三者层层递进,使得Java的关系更加紧密,结构更加多样,条理更加清晰。

3、 测试的理解与实践

在代码的实际操作过程中,常常会犯理所应当的错误。跟着自己的感官走,忽略了类之间的关联。此时测试就极为重要。可以快速的找到不足之处。此时我还经常使用的是debug方法,这种方法可以使我更加直观的找到不足之处。

4、 课程收获

此阶段获益匪浅。最重要的是思维的转变。由面向过程的编程思维转化为面向对象的编程思维难度是十分大的。因为此时,思维已经固化,难以改变。这个阶段的作业,使我思维获得了逐步改变。现在的我会更加多的去思考类与类之间的关系,而不单单是以前C语言中一个主函数写到底再加上几个函数。

5、对课程的建议

第三阶段作业的难度可以适当增加一些难度,老师讲课非常好,结合实例来看效果更加显著。

猜你喜欢

转载自www.cnblogs.com/viciconquer/p/12811471.html
今日推荐