java学习第一阶段小结

距离java课程的开始已经过了将近一个月的时间,这个月从接触Java的懵懂、一无所知,到现在可以完成一些简单的类,这其中获益匪浅。

    上个学期,刚刚结束了C语言课程的学习。这个学期开始了JAVA课程。从面向过程的思想到面向对象的思想的转变注定不会太简单。

    课程设计十分新奇,每四周为一个阶段,作业难度逐步上升,其中有许多迭代关系,让人真正的可以在训练题目中有所收获。接下来对前三次作业做出一个阶段性总结。

1、作业过程总结

第一次作业:第一次作业进行时,对java的认知尚浅。刚学会一些Java语法,在这些语法的基础上使用eclipse实现。其实心意不多,与C语言的关系更加类似于换汤不换药。思想是在C语言中学习过的,只是机械化的套用了Java语法,难度并不大。不过,麻烦的地方在于,当时有许多并没有学习过的知识,比如int 类型与double类型之间的转化,数组的引用。这导致学习成本较高,不懂的知识就需要去学习,查阅资料。             

 第一题是计算税率。税率的计算并不太难,但是多种情况的分类十分冗杂,随便一个地方出错就需要找得满头烂额。实际实现还是非常简单的概念,就是利用If else链实现。将四种税务情况用整体的if else,而每种情况中所对应的纳税门槛用子if else 链完成。逻辑清晰。但实际实现的时候还是遇到了困难。情况分类过多,导致出现了数据输入错误低级错误。由于在C语言的基础中,我对于debug的掌握就不深,所以下意识选择逐步排查,也就是一步一步的查找过去。

这无疑是非常低级的做法,耗时,效率低。尽管最后找到了错误的地方,但是好了非常多的时间,未免有些得不偿失。经过这道题目的学习,深刻体会到debug的重要性,对此也在完成此次作业之后对debug的使用进行了强化训练(设置断点排查数据)

   第二题就相对简单的多判断坐标点的所在范围,只需要满足xy的复合条件就可以顺利实现了,这里就不进行过多赘述。

   第三题是电话键盘字母数字转化。这一题其实我使用的方法属于比较低级的,基础的。即对应的字母就给num赋值,再进行输出。

   第四题判断三角形类型。由于三角形三条边规定的数字类型是double类型,所以这里就面临了一个以前从来没有注意过的问题——数据转化。由于是double类型,所以在判断直角三角形是,只能近似相等,而不相等。在这里着实困扰了我许久,这道题也就成为了最后一个才拿到满分的题目。在查阅资料之后学习到了一种数据转化的方法,终于才将直角三角形相关的判定实现。这一题补足了我对数据类型转化的知识盲区,获益匪浅。

   第五题统计最大数字出现的次数。既然要统计最大数字出现的次数,很自然的就应该先找到最大数字。并且重新查找,输出次数。很自然的就想到了数组的方法。但是Java中的数组我之前从来没有使用过,所以我就去自学了数组的使用方法:Array<Integer>a1 = new ArrayList<Integer>(); 以及 a1.add();

   第一次作业耗费时间并不长,主要是第一次作业,难度不大,但是仍然有许多新奇的地方,这考察了我们自主学习的能力。

第二次作业:这次作业难度较第一次相比大幅度提升,虽然仍然是面向过程的思想解决问题,但是难度大,思维复杂度较高。虽然掌握了一些规律之后解题速度变快,但是其中有一个点一直卡着,很早就拿到了98分,因为一个点的错误导致一直不能拿到满分。过了几天之后才发现错误所在。

   第一题是解一元二次方程。这一题的难度在于数组数据的传递。其实类似于C语言中的地址,数组名等于数组的地址,直接传入数组的名称就可以了。要注意这里的wrong format形式。当一元二次方程的a等于0时,自然就不是一元二次方程,也就是应该考虑到这个情况输出wrong format

   第二题到第四题,都是不允许使用日期相关的类和方法解决日期相关的问题。这三道题目有很深的迭代关系,故放在一起进行分析。第二题是判断闰年及星期几,在这里要判断日期输入的合法性,要充分考虑各色情况。其实题目说明中已经给出了求星期几的算法。即通过总日期对7求余。这一题给出了非常明显的提示,属于三道题目中的入门题目。第三题是求下一天,由于题目局限性,这题我并没有充分的去思考什么,直接用if else链来完成,分情况讨论,十分冗杂。将下一天的分类情况列出,这也难怪显然是不合理。所以在第四题求下N天时,我修改了算法。因为下N天的情况更加复杂,如果依然要用if else链来实现的,讨论的情况更多,更加复杂,很不友好。经过一番思考之后,由计算天数得到了灵感,通过天数的获取的原理,得到下N天的天数据标准时间的天数。再根据以上条件,得到一个新的日期,该日期就是下N天的日期。算法的原理不难,实现也不难。不过始终有一个点被卡到了,我百思不得其解。寻觅了很久,我才蓦然发现,当初我想着“给计算机节约一些成本”,将初始日期设定在了边界值也就是1820上,却不曾考虑这样会对值产生影响。这样一想当初真是有些幼稚,计算机的计算时间是很快的,或许我之前的想法产生的影响并不会带来什么优化,反而使自己陷入窘境。通过这道题目深刻的了解到,考虑问题要全面立体,要写出优质的代码,不能想当然,理所应当。

   第二次作业从开始做到得满分耗费的时间较第一次作业明显增加。不过这也有一个测试点过不了,代码问题未能及时发现的缘故。

 

第三次作业:此次作业难度大。编程思想完全转变,由面向过程的编程思想转变为面向对象的编程思想。由于思维的固化,导致这个转变过程并不会太简单。题目于上周基本保持一致,但是被要求使用类的方法解决问题。类是Java中的一个新概念,从来没有接触过。陌生的东西给人带来恐惧感,一时间不知如何下笔。不明白类的构造方法的含义,不明白类方法的调用,不明白类之间的关系,不明白类的设计。但是,在主方法的指引下,努力艰难的完成了第三周作业之后,我对类的认识达到了一个新的境界。

   第一题是用类解一元二次方程式。由于题目给出了主函数,歧视问题就在集中在了类的设计。经过了上一周的奠定基础,算法并没有难度,那么要设计一个类,首先我们考虑封装性。将三个系数(属性)用private申明,再构造函数,getter,setter方法的使用,最后再完成方法的构建。难度其实并不大。

   第二题是日期类的设计。这里并没有用到类与类之间的关系,而是一个类解决所有相关问题。有了上一周的基础。基本算法都已经实现的差不多了,更需要去做的事情是将这些算法整合到类中。有了第一题的经验,这道题目倒也是行云流水,并未耗费太多功夫。

第三题是日期问题面向对象设计(聚合一),这道题难度飙升。让人非常困然。首先并没有直接给出题目要求,而是给出了类图,这是在锻炼我们读类图的能力。之前了解类图,是老师在课上将了一会儿,但当时并未全面理解,仅仅只是一知半解,所以吃了非常大的亏。因此,我暂停了一段时间的写代码,而去在网上看教程,看类图的含义,关系。网上学习的这段时间获益匪浅,我充分了解了类图的含义。这一题目需要额外四个类,年类、月类、日类之间层层递进。比如说欲调用日类,其中会调用月类,而月类又调用了年类,几个类之间的关系层层递进。此时问题出现了,方法的构造一时间让我陷入困境。与之前的模板一般的构造方法在这里并不奏效 在解决这个问题的过程中,对类的理解更加深入了。 虽然算法大同小异,不过整型最大值、最小值的问题带来了新的困扰。我的计算日期的算法是与标准日期之间的日期差算得的,而这一题目里面的极限值加上我算法中的N天之后,数据越界了。苦思良久并未想到很好的解决方法,只好推翻之前的算法从头来过。当然,会尽量避免连篇的if else链,此后想出了在原来的日期上直接进行加减。然而,正在我满心欢喜之时,运算超时了。之前没有遇到过这种问题,没有太过于注重算法的时间复杂度。于是给出了算法的优化,先对年进行变化,这样运算时间减少了许多。

第四题是日期问题面向对象设计(聚合二)。私以为,从这一题的类图来看,结构较第三题相比明显简单。年类、月类、日类都是相互独立的,被DateUtil类调用。这样写出来的代码,结构清晰,富有条理。算法方面与第三题大同小异,就不过多赘述。  

 

  1. Object Oriented设计心得

       面向对象的设计思想与面向过程的设计思想,核心在一个object。类的设计十分重要,需要花功夫。

     

  2. 测试的理解与实践

       在写作业的过程中,碰到了许多难以解决的问题。如果一味的用“火眼金睛”来解决的话,肯定是不够的。所以要学会debug。合理的设置断点,对解决问题事半功倍。

     

  3. 课程收获

       本阶段学习完成,思维发生了由面向过程到面向对象的改变,这样更加合理,符合客观世界的规律。了解了类的单一职责原理。同时,在写代码之前,可以先冷静思考。当一切情况都了然于胸时,代码自然信手拈来,而且能写出更加优质的代码。

 

                           

 

posted @ 2020-04-03 13:03  vici_conquer  阅读(165)  评论(0)    收藏  举报