Java初学问题?

  Java初学者必读,近年来各种各样的编程语言不断崛起,但唯有Java是牢牢占据着老大的位置,目前几乎90%以上的大中型互联网应用系统在服务器端开发首选Java。因此,也是吸引了不少年轻人投入到Java的学习之中。

  Java是个平台,我只想说说我对学好Java的一点看法,希望对初学者有所帮助。

  正式开始学习之前,最好是思考一下这两个问题:

  1)你是不是对学习Java有兴趣?

  2)你能够坚持不懈的进行学习吗?

  这是个看起来非常简单但又不应该忽略的问题,你确信自己对Java感兴趣、而且又有吃苦的准备,那你才可能学好Java!如果具备这两点条件,就请继续往下看……

  请不要把你的学习Java之路和其它计算机技术分开看待,技术的联系往往是千丝万缕的,你应该掌握一些学习Java所涉及的基础知识,对于 “CLASSPATH要怎么设置啊”、“跪求JDK下载地址”等等问题,你不该问,因为Internet上太多答案了,甚至换个角度说,你是不是还不适合直接学习编程?

  1)买本Java学习用书

  看书虽然是比较古老的学习方式,但是我们依然不能否认,这依然是最系统,最有效的学习方式之一,推荐可以入手一本《 Head First Java 》。

  记住,网络上学习Java的资源很多,但基本不够系统,拥有一本Java入门书籍,是你系统学习Java的基础。

  2)准备Java开发环境

  安装好JDK编译环境,然后用类似UltraEditEditPlus的文本编辑器配置你的学习环境,在公众号下方菜单,学习中心,Java笔记有详细的安装配置教程。

  初学Java,不建议用IDE工具,通过一行行的敲代码,你会碰到很多问题,只有这样,你才能学会怎样解决问题,并加深自己对Java的理解。

  准备好后,开始进入激动人心的Java学习里程吧!

  三、Java学习之路

  学习Java的过程虽然辛苦些,但又是处处有精彩!学习过程中的心态一定要保持专一,网上关于语言间的“PK”到处都是,别被浮躁影响!认准了Java,你就坚持!克服心魔,恒心最终会给你回报的。

SE了,也就是你要入门学习的内容,不论你日后是选择哪个体系领域作为发展方向,你都得从Java SE起步。

EE,对于AWTSwing是否要学习呢,我个人是觉得还是非常有必要的,特别是其事件处理模式,我强烈建议初学者一定要弄清楚,其他具体的开发就不一定要全面掌握了,毕竟AWTSwing方面的内容足够用几本大部头的书才能描述详尽;当然,如果你的工作就是做 AWTSwing开发,那就另当别论了。

  I/OThread都是基础之一。

  四、Java EE学习之路

  学习了Java SE,还只是完成“万里长征”的第一步。

  接下来选择学习Java EE或是Java ME(或者你还想不断深入学习Java SE,只要你喜欢,你可以一直深入下去,另外还有Java ME);估计选择Java EE方面的学习者会多一些,Java EE所涉及技术非常多,考虑到初学者的接受程度,我会尽量从最常用的角度来介绍。

EE,在开发环境上不建议再用文本编辑器,我感觉Eclipse很适合初学者,也有人喜欢NetBeans,如果你喜欢用别的IDE,都没问题,看自己喜欢吧。

EE中,首先要学习JSP/Servlet(结合TomcatMySQL)技术,建议JSP1.2/2.X的知识都要掌握,毕竟现在很多的在用系统都还是基于JSP,学习JSP,还必须掌握一些外延技术。

  如:你还得掌握HTML基础知识,最好再掌握些JavaScript(目前正火的AJAX技术之一)CSS3的技术,而了解XML是必不可少的(至少描述性配置信息是通过XML来描述的)。在学习JSP/Servlet过程中,应该结合学习 JDBC、数据库开发技术,毕竟绝大多数Java Web项目都是和数据库紧密结合的。

  2)学习数据库开发技术

  这里我想重点说一下数据库开发技术,数据库技术是做业务系统必备技能,Java Web开发人员最低程度都应该掌握SQL语句的使用!数据库技术大体可分为DBA技术和数据库开发技术,对于开发而言,应侧重数据库开发技术,而数据库基本操作,也是要掌握的。常用数据库有DB2OracleSQL ServerMySQL等,你可以结合实际需要,选择一种数据库,并花大力气掌握其开发技术。

  记住,学习数据库开发技术和学习Java EE,是相对独立的,你可以在学习JSP/Servlet的同时,学习数据库开发技术(SQL语句等),或者先学数据库开发技术,之后再学习JSP/Servlet

  3)学习Java EE其它开发技术

  之后的学习中,再逐渐扩展到其他Java EE技术。

EE有些感悟的时候,你自然就会想不断扩展你的知识面,这时候你可以学习SpringHibernate,以及各种Web框架(StrutsJSFWebwork或是Tapestry)

  随着技术、经验的不断积累,你会逐步关注分析、设计等更高层次的知识,这时候,你可进一步学习相关的UML、模式等知识(积累了一定经验,你就可以安排自己学习这些知识了)

  永远记住:自始至终,实践是学习Java技术历程中极其重要的一环。脱离了实践,是学不好技术的!

  、实践之路需要一步步走来,要学的东西很多,勤奋是金!

  善于利用Internet上众多的资源,多吸取些别人的经验。

  目前关于Java的争论很多,如“Java正走下坡路”、“Ruby必将取代Java”等论点甚嚣尘上,但正如我前面所言,这是一种浮躁的表现,Java的前景非常好,特别是Java开源以后!就让他们去吵去吧,掌握了Java,你就掌握了当前最火的技术。

  以上,你大概了解应当如何学习Java了么?大家伙儿加油哦!

在Java编码中,我们容易犯一些错误,也容易疏忽一些问题,因此笔者对日常编码中曾遇到的一些经典情形归纳整理成文,以共同探讨。

很多类的命名相同(例如:常见于异常、常量、日志等类),导致在import时,有时候张冠李戴,这种错误有时候很隐蔽。因为往往同名的类功能也类似,所以IDE不会提示warn。

写完代码时,扫视下import部分,看看有没有不熟悉的。替换成正确导入后,要注意下注释是否也作相应修改。

命名尽量避开重复名,特别要避开与JDK中的类重名,否则容易导入错,同时存在大量重名类,在查找时,也需要更多的辨别时间。

有时候调用API时,会想当然的通过名字直接自信满满地调用,导致很惊讶的一些错误:

示例二:这是去年的今天吗(今年是2012年)?结果还是2012年:

问自己几个问题,这个方法我很熟悉吗?有没有类似的API? 区别是什么?就示例一而言,需要区别的如下:

名字起的更详细点,注释更清楚点,不要不经了解、测试就想当然的用一些API,如果时间有限,用自己最为熟悉的API。

3. 有时候溢出并不难

有时候溢出并不难,虽然不常复现:

x是多少?竟然是-,明明加上1之后还是long的范围。类似的经常出现在时间计算:

数字1×数字2×数字3…

在检查是否为正数的参数校验中,为了避免重载,选用参数number, 于是下面代码结果小于0,也是因为溢出导致:

1). 让第一个操作数是long型,例如加上L或者l(不建议小写字母l,因为和数字1太相似了);

2). 不确定时,还是使用重载吧,即使用doubleValue(),当参数是BigDecimal参数时,也不能解决问题。

对数字运用要保持敏感:涉及数字计算就要考虑溢出;涉及除法就要考虑被除数是0;实在容纳不下了可以考虑BigDecimal之类。

如果有正在学java的程序员,可来我们的java技术学习扣qun哦:90277,2577里面免费送java的视频教程噢!小编花了近一个月整理了一份较适合18年学习的java干货,送给每一位java小伙伴,欢迎初学和进阶中的小伙伴。

有时候觉得log都打了,怎么找不到?

示例二:找不到log!

1). API定义应该避免让人犯错,如果多加个重载的log.error(Exception)自然没有错误发生。

在DCL模式中,总是忘记加一个Volatile。

毋庸置疑,加上一个吧,synchronized 锁的是一块代码(整个方法或某个代码块),保证的是这”块“代码的可见性及原子性,但是instance == null第一次判断时不再范围内的。所以可能读出的是过期的null。

我们总是觉得某些低概率的事件很难发生,例如某个时间并发的可能性、某个异常抛出的可能性,所以不加控制,但是如果可以,还是按照前人的“最佳实践”来写代码吧。至少不用过多解释为啥另辟蹊径。

在释放多个IO资源时,都会抛出IOException ,于是可能为了省事如此写:

假设bos关闭失败,bis还能关闭吗?当然不能!

虽然抛出的是同一个异常,但是还是各自捕获各的为好。否则第一个失败,后一个面就没有机会去释放资源了。

代码/模块之间可能存在依赖,要充分识别对相互的依赖。

7. 用断言取代参数校验

如题所提,作为防御式编程常用的方式:断言,写在产品代码中做参数校验等。

换成正常的统一的参数校验方法。因为断言默认是关闭的,所以起不起作用完全在于配置,如果采用默认配置,经历了eventList != null结果还没有起到作用,徒劳无功。

有的时候,代码起不起作用,不仅在于用例,还在于配置,例如断言是否启用、log级别等,要结合真实环境做有用编码。

8. 用户认知负担有时候很重

先来比较三组例子,看看那些看着更顺畅?

1). 保持参数传递顺序;

3). 保持表达,少缩写也会看起来流畅点。

在编码过程中,不管是参数的顺序还是命名都尽量统一,这样用户的认知负担会很少,不要要用户容易犯错或迷惑。例如用枚举代替string从而不让用户迷惑到底传什么string,诸如此类。

9. 忽视日志记录时机、级别

示例一:该不该记录日志?

示例二:记什么级别日志?

在用户登录系统中,每次失败登录:

1). 移除日志记录:在遇到需要re-throw的异常时,如果每个人都按照先记录后throw的方式去处理,那么对一个错误会记录太多的日志,所以不推荐如此做;但是如果re-throw出去的exception没有带完整的trace(即cause),那么最好还是记录下。

2). 如果恶意登录,那系统内部会出现太多WARN,从而让管理员误以为是代码错误。可以反馈用户以错误,但是不要记录用户错误的行为,除非想达到控制的目的。

日志改不改记?记成什么级别?如何记?这些都是问题,一定要根据具体情况,需要考虑:

1). 是用户行为错误还是代码错误?

2). 记录下来的日志,能否能给别人在不造成过多的干扰前提下提供有用的信息以快速定位问题。

在JAVA中,我们常用Collection中的Map做Cache,但是我们经常会遗忘设置初始容量。

那么对于一个需要做大容量CACHE来说,从16变成一个很大的数量,需要做多少次数组复制可想而知。

如果初始容量就设置很大,自然会减少resize, 不过可能会担心,初始容量设置很大时,没有Cache内容仍然会占用过大体积。其实可以参考以下表格简单计算下, 初始时还没有cache内容, 每个对象仅仅是4字节引用而已。

不仅是map, 还有stringBuffer等,都有容量resize的过程,如果数据量很大,就不能忽视初始容量可以考虑设置下,否则不仅有频繁的 resize还容易浪费容量。

在Java编程中,除了上面枚举的一些容易忽视的问题,日常实践中还存在很多。相信通过不断的总结和努力,可以将我们的程序完美呈现给读者

这个该怎么理解呢?按照我个人的想法:在这个程序中,通过new创建的HashSet类的对象,它只能存放Dog类型的对象,但是能调用add方法增加Cat类的对象cat。我感觉说不通。

其实,这也算一个历史遗留问题,java最开始设计的时候没有支持泛型,是在后来的版本里加上的,为了兼容以前的代码,在运行的时候,这些泛型信息就被丢掉了。你贴出的代码实际上是很危险的,试想如果你执行下面的代码


就会报一个。所以你应该这么写


[转]JAVA的泛型只是一个语法糖,实际上在运行时还是有类型转换的过程,从JVM生成的代码来看,和传递一个Object(或者extends的类型)没什么区别。当然泛型的最大好处是编绎期的类型错误检查。

明白JAVA泛型的大致实现原理之后,看很多泛型代码都比较清晰了:)

和C++的泛型比较,C++的泛型是在编绎期实现的,为每一个类型都生成一份代码,所以C++的泛型容易让编绎后的代码出现膨胀。

免责声明: 本文仅代表作者个人观点,与爱易网无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。

我要回帖

更多关于 初学画画入门 的文章

 

随机推荐