仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 486|回复: 10
打印 上一主题 下一主题

[学习教程] JAVA教程之全球一切程序员城市犯的毛病

[复制链接]
萌萌妈妈 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:28:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
通过视频学习比传统的大课堂学习更适合成人化的学习规律。有人说大课堂气氛好,学习氛围浓,热闹,可以认识很多人。程序|程序员|毛病昔时,国际巨星成龙的「龙种」暴光,世人求全谴责他对不起娇妻林凤娇,逼得他出头召开记
者会,向众人自白他犯了「全球一切汉子城市犯的毛病」。历来没犯过这类毛病的我,
也因而经常以为本人不是个汉子。

固然没犯过「全球一切汉子城市犯的毛病」,可是我却是已经犯了「全球一切程序员
城市犯的毛病」。不论利用何种言语,全球一切程序员都必定犯过这类毛病,那就是:
太依附编译器,却不晓得编译器做了哪些事。

一样平常来讲,越高阶的程序言语,会供应越多语法上的便当,以便利程序撰写,这就俗称为
syntacticsugar,我称其为「语法上的长处」。虽然说是长处,可是假如你未能懂得该语法
的本色内在,极可能会何尝长处,却吃尽甜头。

不久前,我收到一个电子邮件,读者列出上面的Java程序,向我求救。看过这个程序以后
,我断定这又是一个「全球一切程序员城市犯的毛病」。

//程序1

classSingleton{privatestaticSingletonobj=newSingleton();publicstaticintcounter1;publicstaticintcounter2=0;privateSingleton(){counter1++;counter2++;}publicstaticSingletongetInstance(){returnobj;}}//程序2publicclassMyMain{publicstaticvoidmain(String[]args){Singletonobj=Singleton.getInstance();System.out.println("obj.counter1=="+obj.counter1);System.out.println("obj.counter2=="+obj.counter2);}}

实行了局是:
obj.counter1==1
obj.counter2==0

你有无被此了局吓一跳?乍看程序代码,你极可能会以为counter1和counter2的值必定
会相称,但实行了局明显不是云云。实在,程序1被编译后的程序应当同等于上面的程序3


//程序3classSingleton{privatestaticSingletonobj;publicstaticintcounter1;publicstaticintcounter2;static{//这就是classconstructor//在进进此classconstructor之前,class已被JVM//设置好内存,一切的staticfield城市被先设定为0,//以是此时counter1和counter2都已是0,且singleton为nullobj=newSingleton();//成绩皆由此路程序发生//counter1不会在此被设定为0counter2=0;//counter2再被设定一次0(实际上是画蛇添足)}privateSingleton(){//这是instanceconstructorcounter1++;counter2++;}publicstaticSingletongetInstance(){returnobj;}}

这是由于:当class具有staticfield,且间接在宣布处透过「=...」的体例设定其值时,
编译器会主动将这些叙说依序搬到classconstructor内。一样地,当class具有instance
field,且间接在宣布处透过「=...」的体例设定其值时,编译器会主动将这些叙说依序
搬到instanceconstructor内。

此程序在classconstructor内,还未将staticfield初始化时(这时候候,counter1和cou
nter2都是0),就呼唤instanceconstructor,而instanceconstructor居然还会往更动
staticfield的值,使得counter1和counter2都酿成1。然后instanceconstructor实行完
,回到classconstructor,再把counter2的值设为0(可是
counter1保持稳定)。最初的了局:counter1即是1,counter2即是0。

欲更正程序1,办法有三:

-办法一:将singletonfield的宣布调到counter1与counter2field以后。
这是最好的作法。
-办法二:将counter2=0的宣布中,「=0」的部分删除。这类作法只要在但愿
-办法三:将初始化的举措搬到classconstructors内,自行撰写,而不依附
编译器发生。这是最保险的作法。

怎样制止犯下「全球一切程序员城市犯的毛病」,我给列位Java程序员
的倡议是:
-熟读JavaLanguageSpecification
-在有疑问时,利用J2SDK所供应的javap来反组译JavaBytecode,间接察看
编译后的了局。

上面是我用javap来反组译程序1的树模:

C:>javap-c-classpath.SingletonCompiledfromMyMain.javaclassSingletonextendsjava.lang.Object{publicstaticintcounter1;publicstaticintcounter2;publicstaticSingletongetInstance();static{};}MethodSingleton()0aload_01invokespecial#1<Methodjava.lang.Object()>4getstatic#2<Fieldintcounter1>7iconst_18iadd9putstatic#2<Fieldintcounter1>12getstatic#3<Fieldintcounter2>15iconst_116iadd17putstatic#3<Fieldintcounter2>20returnMethodSingletongetInstance()0getstatic#4<FieldSingletonobj>3areturnMethodstatic{}0new#5<ClassSingleton>3dup4invokespecial#6<MethodSingleton()>7putstatic#4<FieldSingletonobj>10iconst_011putstatic#3<Fieldintcounter2>14return

实在Java的syntacticsugar其实不算多,C#的syntacticsugar才真的是无所不在,
也因而C#的初学者更简单犯了「全球一切程序员城市犯的毛病」。很多C#的书城市一边
先容C#语法,一边先容编译以后MSIL(.NET的两头言语,相似Java的Bytecode)的了局,
但是Java的书却鲜少这么做。

虽然说是「全球一切程序员城市犯的毛病」,可是这不代表你犯了此毛病以后,仍能够同
爱乞贷的曹启泰一样平常地「仰面挺胸、义正词严」。只需故意,实在这一类的毛病还是能够
制止的。



你对java乐观有点盲目。java的关键就是在服务器上表现优异,而且它提供了整个开发所需要的工具。应该是说,看哪天。net有没有机会赶上java。
蒙在股里 该用户已被删除
沙发
发表于 2015-1-21 07:37:08 来自手机 | 只看该作者
J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。
板凳
发表于 2015-1-30 11:10:55 | 只看该作者
Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站
深爱那片海 该用户已被删除
地板
发表于 2015-2-6 07:41:38 | 只看该作者
所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。
小魔女 该用户已被删除
5#
发表于 2015-2-8 20:39:08 | 只看该作者
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.jdon.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
活着的死人 该用户已被删除
6#
发表于 2015-2-12 10:13:04 | 只看该作者
让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。
谁可相欹 该用户已被删除
7#
发表于 2015-3-3 01:06:58 | 只看该作者
如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。
乐观 该用户已被删除
8#
发表于 2015-3-7 05:10:18 | 只看该作者
有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)
灵魂腐蚀 该用户已被删除
9#
发表于 2015-3-10 22:39:58 | 只看该作者
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
admin 该用户已被删除
10#
发表于 2015-3-17 11:46:40 | 只看该作者
自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。
透明 该用户已被删除
11#
发表于 2015-3-24 09:19:42 | 只看该作者
Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-24 01:36

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表