1、为什么要选择学习JAVA?
现在疫情这么严重,各行各业都不好过,为了能有一技之长,找一个收入相对较高的工作,没有一点真本事可是不行的,我选择了学习java。
附上学习资源:ziyuanshare.cn/res/detail?resid=29
在大学里,本身不是学编程的,但是多多少少有所接触,那有人要问了,软件编程有很多,比如.net,php,嵌入式等等,为什么我就选择java呢?因为在选择之前,我做了大量的比较。
首先不要太过相信各种培训机构的说法,当你要走向社会的时候,就不要再把自己当成学生,不要把自己的将来交给别人,学会运用自己的眼睛去观察,去了解这个世界。那么怎么才能确定自己将来的方向?如何才能从纷繁复杂、或真或假的数据世界中挖出一条路?我讲一个通过招聘网站的观察方法。可以先去各种招聘的网站上查询信息,综合了各大招聘网站的数据,这些数据都是最真实不掺假的原始数据,你可以每隔一段时间搜索一次,一些规律就会被总结出来了。比如说我在51job中搜索java,全国大概提供了3万个职位。 然后要多翻几页,这样不仅能够看清楚大概有多少是有效的职位,而且还可以看清楚用人单位最关心的技能是什么,这个很重要,决定着你将来要花多少时间和精力在特定的知识点上,比如说swing,搜了一下,全国只有700个左右的职位,仔细读了一下,也并非全是有效的职位,花太多时间和精力在这个上面就不值得了,当然自己感兴趣或者为了研究的话另当别论。不过如果是为了快速的就业,把太多时间和精力花在很多职业生涯的前一、二年用不到的知识上就太可惜了。同时,并非某一个行业的职位数目少,就不能当作一个方向进行选择,比如.NET,我搜索到的职位数是1.6万左右,比java少,是不是就选java了呢?不一定,因为java职位虽然多,但是可能竞争者可能也多,有些方向虽然职位数不多,但是和你竞争这些职位的人数量也少,不见得就不能选择。不过,如果某一个方向的职位数目过少,你可就要小心了,选择这样的方向风险会非常大,如J2ME。
我个人觉得java/J2EE、.net、嵌入式开发是不错的三个方向。如果非要在java和.net中选择的话,我个人是推荐java的,原因:
(1)Java能够开发linux、unix服务器上的程序;
(2)JavaEE和.NET在企业应用方面的关注点是差不多的,但是学习了java如果将来想转到.net上会比较简单,几天的学习然后上手开发应该是问题不大的,但是反之就不行了。
当然如果有了些经验之后,你就会发现语言或者平台不再是技术上的阻碍,一些原理性的东西学到手,然后再加上项目经验,使用什么平台,反而不是最重要的。不过如果非要用一种平台进入企业开发的领域,至少在目前,我推荐java。你完全可以不同意我的观点,但是毋庸置疑,如果是为了就业,多到招聘网站阅读阅读职位的信息,对你将来的方向和学习是大有益处的。
2、JAVA入门必备
从我个人的经验来讲,首先要学JavaSE,这是毋庸置疑的。与此同时,我会学习数据结构与算法,这里推荐马士兵老师的经典JAVA教程,我就是用这套教程学习的,讲的非常通俗易懂!
在这儿之后,可以试着完成一些小项目,同时关注一下设计模式的内容,不必强求自己能够完全掌握各种细节,往前走吧。
除此之外,需要掌握一种编程工具,比如说Eclipse;
数据库,可以选择使用Oracle或者MySQL开始。JDBC,用Java连接数据库。可以选择在这个地方切入Hibernate,也可以选择在Struts之后。
HTML \ CSS \ JavaScript,这些东西是做web项目必需的内容。
Servlet \JSP,服务器端必需。
XML 、AJAX,新的流行趋势不能不了解。
作一些小项目吧。比如BBS、留言系统、学籍管理、商城等等,随便找一些业务逻辑比较简单的来做一做:
Struts,MVC的典型应用,Hibernate,OR
Mapping的典范之作。Spring IOC + AOP,面向对象 + 面向切面,完善的旅程。把以前自己的小项目加入Struts、Spring、Hibernate的元素吧。去研究各种商业项目的业务逻辑吧,才能在你的简历中加入浓重的一笔。EJB3.0,java在走了很多弯路后的回归之作,值得研究。SOA,业界铁定的未来趋势,要紧紧跟随。
3、动手,快速提升的必经之路
学习Java要动手,仅仅是看和听是不能够学好编程的。一开始的时候如果没什么思路,可以照猫画虎一段时间,我本人是在某一个领域画虎画了上万行代码的时候才慢慢有自己思路的。就像写作文,要有自己思路总是一般来说要经过几个阶段,首先学习词汇,然后学习造句,然后大量阅读别人的文章,自己模仿着写一些,逐渐的经验积累,才能形成自己的思路。学编程,恐怕也得慢慢的来吧,只是看一看、听一听视频,是不足以学好编程的。
所以,动手吧,跟着做,一行一行的跟着敲,一个项目敲完了,比如坦克,再试着加一些自己的功能,按照自己的思路敲一些代码,收获远比干听大的多。
顺便提醒一句,要理解代码思路之后再跟着敲,背着敲,千万不要左边摆着别人的程序,右边自己一个一个子母的写,这就不再是程序员了,成了打字员了。
4、提升学习效率
对于一个以前从来没有接触过java的人,java无疑是庞大的,似乎每个领域拓展开来都是一片开阔地,每一个领域要想深入接触到每一个细节所耗费的精力都是巨大的。这个时候大家都胸怀壮志,两眼发光的盯着每一个崭新的知识点,遇见了任何一个知识点都恨不得抠的清清楚楚,明明白白。
我不建议这么做,因为人的精力是有限的,我的学习方式是,抓大放小,要事为先,比如说我在学习J2SE的时候,学到GUI这一章,有的人认为,既然学到这儿了,我们去把SWING细细的了解一遍吧;还有的人,遇到了在Linux下的Shell编程,就恨不得把Shell先学成专家才肯,或者是才敢,继续往下学习;有没有过这样的感觉,一本书的上册没有学好,觉着下册心里也没底儿,甚至非要把上册复习一遍才敢继续学习。如果你也是这样,要去看看心理医生啦,没准儿会有洁癖的毛病。
任何事情都要追求完美才敢继续往后进行,是一种性格缺陷,大胆的放弃一些东西吧,有失才有得,把自己有限的、宝贵的精力用在对于就业直接相关的地方,这才是最有效率的学习方式!等你参加工作,有了可持续发展的事业动力和经济基础,有时间有精力闲的没事儿干的时候,再去研究那些其它吧。
5、有问题,不要怕!
既然是学习,就不可能不遇到问题。
那么,遇到问题之后,环境配不通,程序调不过,运行不正常,遇见这些恼人的问题的时候,该怎么办呢?
首先我要恭喜你,遇见问题,意味着你又有涨经验的机会了,每解决一个问题,你的JAVA经验值就应该上升几百点,问题遇到的越多,知识提升的越快。 但是总是解决不了也是很恼人的,怎么办呢?
我是这么来处理的:
(1)仔细观察错误的现象
学习编程并不是一件很容易的事情,自己首先要重视,要用心才可以。 在开发中,仔细观察出错信息,或者运行不正常的信息,是要做的第一件事。
对于错误的现象,这里又分三种情况:
A:错误信息读懂了,那么请进入2步:要仔细思考问题会出在哪些环节
B:没读懂,愣是一点没看懂,google一下
C:读了个半懂,有些眉目但是不太能确定,可以请教老师或者同学。
(2)要仔细思考问题会出在哪些环节(重要)
当你读懂了一个问题之后,要好好的思考这个问题可能会在哪些环节上出错。
写一个网络程序,总是发现服务器端打印不出接收的数据,有几个环节会出错?仔细分析这个现象的环节:
客户端产生数据->按“发送”按钮->发送到服务器->服务器接收到后打印,这几个环节都有可能会出错:
有可能客户端根本就没产生数据,有可能发送按钮按下去后根本就没发出去,或者发出去的不是你产生的东西,或者根本就没连接网络,或者发送出去服务器没有接收到,或者接收到之前就打印了等等等等。
学着去这样仔细的分析程序的环节和这些环节可能会产生的问题,你的经验值定然会大幅度快速的提升,这样做很累人,但是一件事情如果做下来一点都不累的话,这个东西还有价值吗?
在网页A输入了一个人的名字,提交到B,首先存储到数据库,然后再读出来,发现乱码!怎么办?当然是分析环节:
客户输入->HTTP发送->B接收->存储到数据库->读出->展现到网页
(3)定位错误
定位有以下三种办法:
A 打印输出,比如java的System.out.println(),比如js的alert(),这种办法常用,必须掌握
B Debug,可以参考我们的视频《坦克大战》,详细讲了Eclipse的调试。
C 删掉一部分调试一部分,也就是去掉一部分的功能,做简化,然后调试剩下的功能,JSP和JavaScript常用。
(4)如果还不行,google吧
还查不出来?我多半是去请教别人或者进论坛发帖,请别人一起帮我解决问题。
6、附上我的学习步骤
(1)J2SE
面向对象-封装、继承、多态,内存的分析
递归 集合类、泛型、自动打包与解包、Annotation
IO 多线程、线程同步
TCP/UDP AWT、事件模型、匿名类
正则表达式 反射机制
(2)数据库(Oracle或者MySQL)
SQL语句 多表连接,内外连接,子查询等
管理表、视图、索引、序列、约束等 树状结构存储
存储过程、触发器 数据库设计三范式、
(3)JDBC
JDBC基础 连接池
树状结构存储与展现 DataSource & RowSet
JDBC连接Oracle及MySQL
(4)HTML_CSS_JAVASCRIPT
html、css、javascript基础语法 JavaScript Form判断
Dom编程基础(事件处理等) JS常用效果如TreeView、下拉联动等
JS学习方法 JS调试方法
DreamWeaver初步(建立HTML、Table、Form、CSS)等
(5)Servlet & JSP
tomcat基础 servlet基础
web.xml配置基础 web application的结构
servlet生命周期 request response等常用方法
ServletContext类 HTTP协议基础(GET POST)
Cookie Session Application
JSP的几种语法(包括JSTL等)注意在项目中练习,不要拘泥于语法细节而裹步不前。
(6)Struts
多层架构理论 Model 1 and Model 2
Struts基本概念 MVC
Action与业务逻辑类的关系 在Struts与JSP之间传递数据
Struts处理流程(控制流) Struts TagLib(了解常用的)
JSTL ActionForm
字段收集 上传文件
类型转换 DTO
动态Action Form 验证框架
ActionForward 转发与重定向 动态生成ActionForward
全局与局部的ActionForward Action Forward Scope
UnknownActionMapping Action的线程安全
I18N 如何切换语言环境
Struts异常处理机制 程序处理 自动处理自定义异常处理器
Struts的多模块配置
(7)XML
(XML/XSL、XSLT/DTD、SCHEMA等基础的概念、关于Java的编程可以暂时扔在一边)
(8)Hibernate
OR Mapping原理
Hibernate基础开发步骤
Hibernate基本接口(重点Session)
普通属性映射
关联关系映射
Native SQL
inverse lazy cascade
继承关系映射
HQL
性能优化 一级缓存 二级缓存 查询缓存
事务与并发 悲观锁、乐观锁
OpenSessionInView
CurrentSession
(至于JTA、联合主键、自然主键、动态主键、Any类型 Creteria Queries Intercepter and Event自定义类型等,可以暂时扔在一边)
(9)Spring
IOC/DI
Spring配置
Spring架构
AOP及SpringAOP
声明式事务(AOP)
Spring + Hibernate Spring支持Web
Scope
(其他的Spring模块对于自学来说可以暂时扔在一边)
(10)EJB3.0
J2EE架构基础(JTA JMS等)
EJB基础(地位及基本理论、分类等)
Annotation
Ant编译与部署EJB
Session Bean
EJB的依赖注入
Persistence API
(可以用JBoss学习EJB3.0)