万事万物皆有其发展规律,学习Java也不例外。
以下是我根据教学经验,总结出来的小白在学习Java各阶段时的心路历程,当你在学习期间欣喜、困惑时,不妨看一看,也许这些都是必经之路。
使用Java完成第一个Hello World
根本不关心什么Java的发展史、JDK配置的原理,只想照着书(或跟着老师)把第一个Hello World运行出来。大多数学生,不论用什么办法,还是能够成功运行的,运行后非常开心,感觉自己马上就是一个程序员了。
变量、选择结构
这个阶段最大的难点不是java本身,而是自己的思维方式。因为人类进化出来的思维,远远快于编程语言的处理流程。
举个例子,学习if的时候会让你判断“当一个数是三位数的时候,输出‘合法’,否则...”,那到底if后面的“三位数”该怎么判断?人脑经过了几千年的进化,只要看一眼数字,就马上能够知道它是不是三位数,根本不需要什么判断,直觉能辨别出来。所以这个时候,当你想用计算机编程描述这个“判断”时就懵了,因为你无法将人脑的思维直接显化成计算机程序。怎么办?懵的原因是人脑太快、而计算机太笨,所以我们得让自己变慢、变笨一点,才能符合计算机的思维。怎么变慢、变笨?可以让自己的思维逻辑退化一点,退化到小学甚至幼儿园时的状态。回忆在小学期间,数学老师是不是教过你“如果一个数字>=100,并且<=999”它就是一个三位数。对了!当思维退回到小学的状态时,也许你就能写出来判断三位数的代码是:if(数字>=100 && 数字<=999)。发现没有,这个阶段,根本不是难,而是太简单了,以至于你脑子还不适应这种太简单的思维方式。
此阶段总结:没有难度,只是还没有编程的思维方式,解决的唯一办法:多敲代码。只要真心想学,大部分人还是能顺利完成此阶段的。
循环结构、数组
这应该是很多人第一次真正遇到门槛的地方。很多学生,在此阶段最爱问的问题就是“老师,语法我都记住了,但就是自己写不了程序”、“老师,你上课讲的代码我都懂,但就是自己不会写”。等一下,这些问题好像挺熟悉的,是不是曾经在哪里听过?高中或大学时的英语课上,我们好像也经常这么问英语老师“老师,单词我都会拼,但就是写不了作文”、“老师,你上课讲的如何写作文,我都能听懂,但就是自己写不出来”。所以,怎么办,你只要回想一下你是如何学习写英语作文就行了,一个字“练”。多背几篇作文、多仿几篇作文,反复!反复!反复!然后突然有一天,自己也不知道发生了什么,就突然会写作文了!停一下,这句话是不是又听熟悉的?理科生在化学“酸碱中和滴定”的实验课上,是不是能听到一句话“当最后一滴刚好使指示剂颜色发生明显的改变,而且半分钟内不恢复原来的颜色,即为滴定终点”,听不懂的没关系,因为这个实验还配了一张图,如下所示。
这个实验大致是说:某一种液体本来是碱性的,我们可以向这种容器不断注入酸性溶剂,从而使得它变成酸性。但是在注入的初期,液体会一直抗拒,始终保持碱性。不过只要你坚持注入酸性溶剂,它会在某一滴溶剂的作用下,突然一跃而上变成酸性。也就是说,你只要坚持,就会突然有一天达到你想要的。重点是:这个实验告诉我们,碱性转为酸性的过程 不是线性的,而是突变式的;学习也一样,学java时的自我感觉并不是“每天进步一点点”,而是在前期很长一段时间都感觉“努力了没用”,但只要你不放弃,在你依旧坚持不懈后,就会突然一个时刻恍然大悟、从此不再是小白了。这也正好符合哲学上量变到质变的过程。
说了这么多,只是想告诉你,在学习循环、学习任何东西时其实是一样的。初期总是那么的迷茫,那么的无助,感觉自己付出了那么多,但好像得不到任何收获。但不论是自然科学,还是人文社科,都在告诉我们:这些都是正常的现象。你只管坚持,当到达“那一滴”的时候,你就成功了。
面向对象(类和对象、抽象类、接口、OOP三大特征等)
很多人在接触Java之前,已经学习过学校开设的C语言课。在面向对象以前,编程的重点可能就是一些简单的数学问题(水仙花数、回文数、求几个数之间的最大值、冒泡排序、打印几个图形等)。但从面向对象开始,又会进入一个全新的领域,开始真正接触Java了。总之,又要换思维模式了。以前可能都习惯将全部的功能都写在一个main()方法里了,但从面向对象开始,这些“习惯”都要一一打破,然后重新培养。很难,但大家都一样。
除了思维方式要重新培养以外,这个阶段对逻辑的要求也越来越高了。现在开始,我们不再把全部的功能都往main()里面堆,而是可能会把一个功能写在8个类的20个方法里,然后你还得非常清晰的知道这8大类、20个方法之间是如何相互关联的。这就像很多人看《红楼梦》,对每一个人物角色都挺熟悉的,但把红楼梦里所有的人物摆在一起,让你理清他们之间的各种错综复杂的恩怨情仇关系时,就头晕眼花了。
Java应用(集合、文件、网络编程、IO/NIO、JDBC等)
学习这些内容的特点是:初学时觉得难,熬过之后就觉得简单。原因很简单,因为这些内容大多属于应用层面、属于API的调用而已。说白了,就是记一些类名/接口名/方法、记一些“编写套路”。例如JDBC,第一次写时,会觉得步骤太烦、繁琐、麻烦!但写上10次之后就发现,每次编写JDBC的代码90%以上都是相同的,甚至可以把它复制下来存留,以后再用时直接粘贴完事。
实际上,很多学生在学这里时,刚开始感觉一头雾水,但随着练习次数的增多,自己也发现每次编写的代码都差不多,慢慢也就不再深究理论,而是把代码背了下来。
多线程
初学JAVA时,“用循环解题”是第一个难点,理解“面向对象的思维”是第二个难点,而“如何使用多线程”应该是很多初学者的第三个难点。(如果还觉得其他哪个知识点难,应该就是你练习太少了)
为什么那么多人觉得多线程难呢?第一,它的确有点难度;第二,3年以内的开发者很少接触到多线程。换句话说,很多人只是在学习多线程这一章的时候,写了那么几个标准的多线程代码。多线程这堂课下课后,就几乎没再接触过Thread了,因此觉得它难也是情理之中的事了。
我个人建议,在第一次学习Java时,当遇到循环、面向对象、多线程、甚至后面学习各种开源框架等“难点”时,如果当时没有学懂,就暂时放下、假装自己学会了就已经OK了。为什么这么说呢?因为据我的教学经验,很多搞技术的学生都有一种“强迫症式的较真态度”,对于一个知识点,如果没搞懂就非常难受,非得把它彻底搞明白后,自己的思想才能解脱,才能安心去学下一章的新知识。 对于这种“较真”的学习态度,好还是不好?得看你所处的学习阶段了。如果你是大一大二的自学学生,那我非常建议你对每个技术点都去“较真”、都去深挖,等你熬到最后,你一定是大神,大神中的大神。但如果你是大学快毕业了,为了找份工作而临时报了个5个月培训班,那就请你先别“较真”了。培训班的学习强度一般非常大(忽略那种水货机构),一般都是一天一个大知识点。当你对“循环”较真不放手的时候,老师可能都把数组讲完了;当你被多线程折磨的时候,老师可能都把Web前端结课了。所以,如果你当下的学习时间非常紧张,就别较真了,对“难点”学个一知半解就放手,跟着老师学下一章一定是个非常好的建议。况且,对于那些难点问题,没有几个初学者能够一次学明白。并且对于软件开发来说,很多时候把一个知识没有彻底搞懂,根本不会影响你去使用它。试想一下,你学习“循环”多久了,你能保证掌握了全部的循环习题吗?
以上是我对学习Java SE的一些建议,如果觉得有用,请点一下分享、在看。阅读数多的话,会继续更新我对学习其他技术的建议~
- 完 -
InterfaceA是接口,new InterfaceA[2]正确吗?
还在用构造方法给属性赋值?
"hello"+null = ?
读者交流 | JAVA过时了吗?
自己写的java.lang.String能用吗?
答疑 | synchronized有指令重排序的功能吗?
服了,list.add()也会报错!!!
一道JVM面试题,答错率超90%
10行代码2道题,全答对的你月薪多少了?
自己写的java.lang.String能用吗?