经过两个星期四节课的java学习,我也对java这门语言有了一定的认识。刚开始上课的时候,我认为java把C语言中老师所说的模块化编程进行了强调,进行一个类,一个类的编程,在类中构造相应的方法,使用的时候再调用。这样能够减少重复的代码,同时能让代码整体看上去比较整洁。这样写起程序来,调试比较容易,eclipse的自动纠错功能用起来也非常好用,感觉写成一个java的程序在有C语言的基础上还是比较容易完成的。后来慢慢地,老师向我们介绍了面向对象的各类思想以及这些思想在java语言中的使用。后来能够明显感觉到,随着面向对象的各类思想引入以及java语言特点的介绍后,写起程序来难度越来越大了。这是我对面向对象先导课的整体印象。
这门课让我学到的:
总结一下个人在这次先导课程中所学到的。关于第一节课中的总体内容在第一篇博客中总体已经有所总结,这里对后来所了解到的内容进行补充。
首先是构造函数,构造函数可以有多种不同的构造函数,这里涉及到老师上课说过的java类中方法名可以相同,但只要参数个数或者参数类型,返回值类型等不同就会被判定成不同的方法。所以经常会存在方法名相同但是参数类型不同的情况,比如说String类型中的indexOf方法,可以是一个参数,也可以是两个参数,都可以实现各自的目标。所以构造方法也可以有多个,构造方法的方法名与类名相同。如果没有定义构造方法的情况下,对象中各属性均初始化为默认值,如integer类型的值初始化为0等。
java的输入输出也很有特点,刚开始学习C语言的时候,也是先学输出,之后再教输入。但是C语言的输入输出种类并不是很多,java的输入输出种类划分很细,基本能够满足你在C语言中所要实现的输入输出功能。java的输出代码较为简洁,基本几行就可以解决。但输入代码感觉写起来比较繁琐。之后了解到,java的输入输出是基于流的输入输出,这样能够使得程序的输入输出独立于设备,并不关心数据源来自哪里。java的数据流分为字符流和字节流,我们课上所用的一般都是字符流,通过BufferedReader进行相应的输入。
Java的接口是面向对象的一个重要思想,利用java的接口,我们可以在接口里面定义相应的抽象方法,java接口是java面向对象语言的一个重要机制。利用该机制,我们可以使得代码更加简洁。这些是老师上课所告诉我们的。但上完课后,对于接口的意义还不是很能够理解。这里再对接口的相关内容进行补充。首先因为接口定义的是抽象方法,相应的具体方法在类中还要进行重构,感觉是否有接口的影响应该不大。后来通过上网查阅资料了解到相关内容。理解为什么不直接在类中定义相应方法涉及到抽象类的相关内容。在java程序里面多写一个接口或者是抽象类,是为了多态能够实现,如果不用抽象类或者接口进行多态的实现,那么程序中可能就要重载许多个意义相同的方法,并且每增加一个类,就需要重载相应的方法。代码简介度和维护性过低。利用接口或者抽象类来编写程序的话,就能够编写出实现了多态的程序,大大降低了代码的重复性,使得代码看上去较为简洁。同时能够使得后面如果要进行增加类等操作变得更加方便简单。虽然抽象类的实现与接口的实现非常相似,但抽象类与java接口是java的两种不同机制。抽象类是利用java的继承来进行的,但是java的类不可以多继承,所以这个时候,接口就可以派上用场了。利用接口,java程序可以从别的地方实现实现相应的方法。
其次是java字符串的处理,java字符串处理是将字符串抽象为类进行管理。通过相应的方法对字符串进行操作,大大简化了程序中字符串处理相关的代码,从中就可以感觉出java中以类进行编程的方法的优势。Java中字符串的处理有很多相应的方法,在我之前所写的博客中有所记录,作业中我们经常用到split方法来进行对字符串的分割。C语言中字符串处理主要是靠对数组进行相应的操作,每次都要进行代码的重写并且还容易出错。而java将字符串抽象为类之后,每次根据要处理的内容主要对方法进行改动即可。仅仅只是对方法进行调用,而不用去管方法背后是如何实现这些操作的。并不像C语言一样,每次都要从头开始写,大大简化了程序对字符串的操作。
java的运行速度之前是在大一的时候,在学python时所提到过,C语言的运行速度可以说是高级语言里面运行速度最快的语言,而java的速度稍微慢一点,但是也比python快。在进行了先导课的学习之后,了解到了java的运行速度慢的一些原因,java隐藏了指针,所以程序不能够直接对内存分配等进行管理。java就要自动进行频繁的GC活动来对内存进行回收等。尽管这样做使得程序的安全性得到了提高,但是这样也拖慢了程序的运行速度。当然,不管什么语言,数据结构和算法的优劣都会很大程度上影响程序的运行速度。
作业中所遇到的困难
而这几次越来越有挑战的作业中遇到的困难,在之前的博客有所提及,这里进行相应的补充。第一次作业根据助教给的说明文档,在写最后一个方法的时候,并没有认识到java中将对象也可以作为返回值使用,所以最后没有能够按照助教所给的说明文档写出相应的方法。java中将各种数据抽象为对象,在java中对对象可以进行很多相应的操作,比如可以将对象作为参数进行传递,将对象作为返回值或者创建对象的数组等相应的操作。第二次作业中,因为之前没怎么接触过输入输出,所以在输入输出方面遇到了比较多的困惑,后来查阅到文件的通过文件进行输入可以采用BufferedReader来进行,而通过控制台进行输入的话,可以采用Scanner这个类来进行输入。Scanner这个类可以直接将控制台的内容读入后进行处理。同时第二次作业写的过程中还充满了对接口的疑惑。后来逐渐了解到,那个作业本身并不是一定需要接口,只是结合第一次作业如果可以用接口实现的话,就可以实现了上文中对接口可以从别的地方实现相应的方法这一个功能,能够对接口有所熟悉。第三次作业并没有其余面向对象思想的介绍,但是在课上自测的时候,遇到了非常严重的BUG。在每一行的字符串处理的时候,都是直接就用了indexOf,并没有进行其他处理,导致如果查找of单词,出现的位置是第一个字符of的位置,而字符of是包含在其他单词中的。后来课下进行debug后明白,应该每次查找位置后,调整每次indexOf起点的位置,是的每个单词查找到之后,就从查找范围内去掉。从这次课上自测可以看出,其实自己很多时候很难发现BUG,即使有时候可能比较明显。所以,每次的课下自测过程其实很重要。最后作业的过程中,HashMap根据网上的教程,使用起来还算好,但是我们的程序怎么组织HashMap一开始比较不知所措。刚开始想定义一个新类,类中有第一个单词和第二个单词两个属性,然后HashMap的Value里面存储该词组出现的次数,后来发现这样进行操作的话,单词的查找等会有挺多有问题的地方,经过了几次尝试之后,采用了最后作业的方法。算是能够看起来输出好像是对的答案了。
对本课程的建议:
这次先导课是我第一次接触java,但是上下来之后。我感觉吴老师和助教帮助我们打开了java的大门。也给我们指明了一条顺利度过oo课程的道路。课程整体上给我的感觉是挺好的,强调编程实践,课上老师带着大家编程,课下老师和助教总会在群里帮助大家解决问题。总结上次课的错误等,都可以从中学到很多东西。我想提的一个建议是,每次作业是否可以给我们展示一份完成比较好的优秀作业代码。这样我们可以通过阅读其他写的好的代码了解java的编程习惯和规范等。如果害怕大家直接阅读代码而不自己课下去修改自己程序中原来存在的BUG的话,大可以在课程结束的时候,将所有作业优秀的代码给大家一份,让我们可以有借鉴学习的地方。