疯狂Java讲义精粹(含CD光盘1张)(txt+pdf+epub+mobi电子书下载)


发布时间:2020-05-16 12:39:42

点击下载

作者:李刚

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

疯狂Java讲义精粹(含CD光盘1张)

疯狂Java讲义精粹(含CD光盘1张)试读:

内 容 简 介

本书是《疯狂Java讲义》的精粹版,本书同样保留了《疯狂Java讲义》的特性:本书基于Java 7完成,全面介绍了Java 7的新特性。

本书删除了《疯狂Java讲义》中关于图形界面编程、数据库编程的内容,保留了Java的基本语法结构、Java的面向对象特征、Java集合框架体系、Java泛型、异常处理、Java注释、Java的IO流体系、Java多线程编程、Java网络通信编程和Java反射机制的内容。本书的这种调整一方面是为了对《疯狂Java讲义》进行精简,另一方面也是应广大高校老师的反馈:高校课程前期已经讲授过数据库相关内容,因此本书删除了相关内容。本书的写作是基于Java 7完成的,全面介绍了Java 7的二进制整数、菱形语法、增强switch语句、多异常捕获、自动关闭资源的try语句、JDBC 4.1新特性、NIO.2、AIO等新特性。

本书光盘里包含书中所有示例的代码和《疯狂Java实战演义》的所有项目代码。但由于本书并未包含Java图形界面编程的相关知识,因此读者在阅读带图形界面的项目代码时可能有一定困难,此时读者可以参考《疯狂Java讲义》的相关内容,也可以登录http://www.crazyit.org站点与笔者及本书庞大的读者群相互交流。

本书为所有打算深入掌握Java编程的读者而编写,适合各种层次的Java学习者和工作者阅读。本书专门针对高校课程进行过调整,尤其适合作为大学教育、培训机构的Java教材。本书不适合只想简单涉猎Java的读者阅读。未经许可,不得以任何方式复制或抄袭本书之部分或全部内容。版权所有,侵权必究。图书在版编目(CIP)数据疯狂Java讲义精粹/李刚编著. —北京:电子工业出版社,2012.1ISBN 978-7-121-15579-6Ⅰ. ①疯… Ⅱ. ①李… Ⅲ. ①JAVA语言-程序设计 Ⅳ. ①TP312中国版本图书馆CIP数据核字(2011)第270650号策划编辑:张月萍责任编辑:葛 娜印  刷:北京中新伟业印刷有限公司装  订:三河市皇庄路通装订厂出版发行:电子工业出版社     北京市海淀区万寿路173信箱 邮编100036开  本:787×1092 1/16 印张:37.25 字数:923千字 彩插:4印  次:2012年1月第1次印刷印  数:4000册  定价:79.00元(含光盘1张)

凡所购买电子工业出版社图书有缺损问题,请向购买书店调换。若书店售缺,请与本社发行部联系,联系及邮购电话:(010)88254888。

质量投诉请发邮件至zlts@phei.com.cn,盗版侵权举报请发邮件至dbqq@phei.com.cn。

服务热线:(010)88258888。

如何学习Java

——谨以此文献给打算以编程为职业、并愿意为之疯狂的人

经常看到有些学生、求职者捧着一本类似JBuilder入门、Eclipse指南之类的图书学习Java,当他们学会了在这些工具中拖出窗体、安装按钮之后,就觉得自己掌握、甚至精通了Java;又或是找来一本类似JSP动态网站编程之类的图书,学会使用JSP脚本编写一些页面后,就自我感觉掌握了Java开发。

还有一些学生、求职者听说J2EE、Spring或EJB很有前途,于是立即跑到书店或图书馆找来一本相关图书。希望立即学会它们,然后进入软件开发业、大显身手。

还有一些学生、求职者非常希望找到一本既速成、又大而全的图书,比如突击J2EE开发、一本书精通J2EE之类的图书(包括笔者曾出版的《轻量级J2EE企业应用实战》一书,据说销量不错),希望这样一本图书就可以打通自己的“任督二脉”,一跃成为J2EE开发高手。

也有些学生、求职者非常喜欢J2EE项目实战、项目大全之类的图书,他们的想法很单纯:我按照书上介绍,按图索骥、依葫芦画瓢,应该很快就可学会J2EE,很快就能成为一个受人羡慕的J2EE程序员了。

……

凡此种种,不一而足。但最后的结果往往是失败,因为这种学习没有积累、没有根基,学习过程中困难重重,每天都被一些相同、类似的问题所困扰,起初热情十足,经常上论坛询问,按别人的说法解决问题之后很高兴,既不知道为什么错?也不知道为什么对?只是盲目地抄袭别人的说法。最后的结果有两种:

1 久而久之,热情丧失,最后放弃学习。

2 大部分常见问题都问遍了,最后也可以从事一些重复性开发,但一旦遇到新问题,又将束手无策。

第二种情形在普通程序员中占了极大的比例,笔者多次听到、看到(在网络上)有些程序员抱怨:我做了2年多Java程序员了,工资还是3000多点。偶尔笔者会与他们聊聊工作相关内容,他们会告诉笔者:我也用Spring了啊,我也用EJB了啊……他们感到非常不平衡,为什么我的工资这么低?其实笔者很想告诉他们:你们太浮躁了!你们确实是用了Spring、Hibernate又或是EJB,但你们未想过为什么要用这些技术?用这些技术有什么好处?如果不用这些技术行不行?

很多时候,我们的程序员把Java当成一种脚本,而不是一门面向对象的语言。他们习惯了在JSP脚本中使用Java,但从不去想JSP如何运行,Web服务器里的网络通信、多线层机制,为何一个JSP页面能同时向多个请求者提供服务?更不会想如何开发Web服务器;他们像代码机器一样编写Spring Bean代码,但从不去理解Spring容器的作用,更不会想如何开发Spring容器。

有时候,笔者的学生在编写五子棋、梭哈等作业感到困难时,会向他们的大学师兄、朋友求救,这些程序员告诉他:不用写了,网上有下载的!听到这样回答,笔者不禁感到哑然:网上还有Windows下载呢!网上下载和自己编写是两码事。偶尔,笔者会怀念以前黑色屏幕、绿荧荧字符时代,那时候程序员很单纯:当我们想偷懒时,习惯思维是写一个小工具;现在程序员很聪明:当他们想偷懒时,习惯思维是从网上下一个小工具。但是,谁更幸福?

当笔者的学生把他们完成的小作业放上互联网之后,然后就有许多人称他们为“高手”!这个称呼却让他们万分惭愧;惭愧之余,他们也感到万分欣喜,非常有成就感,这就是编程的快乐。编程的过程,与寻宝的过程完全一样:历经辛苦,终于找到心中的梦想,这是何等的快乐?

如果真的打算将编程当成职业,那就不应该如此浮躁,而是应该扎扎实实先学好Java语言,然后按Java本身的学习规律,踏踏实实一步一个脚印地学习,把基本功练扎实了才可获得更大的成功。

实际情况是,有多少程序员真正掌握了Java的面向对象?真正掌握了Java的多线程、网络通信、反射等内容?有多少Java程序员真正理解了类初始化时内存运行过程?又有多少程序员理解Java对象从创建到消失的全部细节?有几个程序员真正独立地编写过五子棋、梭哈、桌面弹球这种小游戏?又有几个Java程序员敢说:我可以开发Struts?我可以开发Spring?我可以开发Tomcat?很多人又会说:这些都是许多人开发出来的!实际情况是:许多开源框架的核心最初完全是由一个人开发的。现在这些优秀程序已经出来了!你,是否深入研究过它们,是否深入掌握了它们?

如果要真正掌握Java,包括后期的Java EE相关技术(例如Struts、Spring、Hibernate 和EJB等),一定要记住笔者的话:绝不要从IDE(如JBuilder、Eclipse和NetBeans)工具开始学习!IDE工具的功能很强大,初学者学起来也很容易上手,但也非常危险:因为IDE工具已经为我们做了许多事情,而软件开发者要全部了解软件开发的全部步骤。2011年12月17日

光盘说明

一、光盘内容

本光盘是《疯狂Java讲义精粹》一书的配书光盘,书中的代码按章、按节存放,即第3章第1节所使用的代码放在codes文件夹的03\3.1文件夹下,依此类推。另:书中每份源代码也给出与光盘源文件的对应关系,方便读者查找。本光盘codes目录下有14个文件夹,其内容和含义说明如下:(1)01~13文件夹名对应于《疯狂Java讲义精粹》中的章名,即第3章所使用的代码放在codes文件夹的03文件夹下,依此类推。(2)本书所有代码都是IDE工具无关的程序,读者既可以在命令行窗口直接编译、运行这些代码,也可以导入Eclipse、NetBeans等IDE工具来运行它们。(3)光盘根目录下提供了一个“Java设计模式(疯狂Java联盟版).chm”文件,这是一份关于设计模式的电子教材,由疯狂Java联盟的杨恩雄亲自编写、制作,他同意广大读者阅读、传播这份开源文档。(4)因为有些读者提出关于《疯狂Java讲义》课后习题标准答案的问题,因此本书光盘根目录下包含一个project_codes文件夹,该文件夹里包含了疯狂Java联盟的杨恩雄编写的《疯狂Java实战演义》一书的光盘内容,该光盘中包含了大量实战性很强的项目,这些项目基本覆盖了《疯狂Java讲义精粹》课后习题的要求,读者可以参考相关案例来完成《疯狂Java讲义精粹》的课后习题。二、运行环境

本书中的程序在以下环境调试通过:(1)安装jdk-7-windows-i586.exe,安装完成后,添加CLASSPATH环境变量,该环境变量的值为.;%JAVA_HOME%/lib/tools.jar;%JAVA_HOME%/lib/dt.jar。如果为了可以编译和运行Java程序,还应该在PATH环境变量中增加%JAVA_HOME%/bin。其中JAVA_HOME代表JDK(不是JRE)的安装路径。如何安装上面工具,请参考本书的第1章。(2)安装MySQL 5.5或更高版本,安装MySQL时选择GBK编码方式。三、注意事项(1)代码中有大量代码需要连接数据库,读者应修改数据库URL以及用户名、密码,让这些代码与读者运行环境一致。如果项目下有SQL脚本,则导入SQL脚本即可;如果没有SQL脚本,系统将在运行时自动建表,读者只需创建对应的数据库即可。(2)在使用本光盘的程序时,请将程序拷贝到硬盘上,并去除文件的只读属性。四、技术支持

如果您使用本光盘中遇到不懂的技术问题,您可以登录如下网站与作者联系:

http://www.crazyit.org前  言

2011年7月,Oracle如约发布了Java 7正式版。接下来笔者对《疯狂Java讲义》进行了升级:使用Java 7改写了全书所有程序,全面介绍了Java 7的各种新特性。《疯狂Java讲义》面市的近3年时间内,得到了广大读者的一致好评。笔者也收到了一些关于《疯狂Java讲义》的建议:有人觉得这本书实在太大、太厚了;也有读者建议把《疯狂Java讲义》拆分成上、下册来出版;针对这些建议,笔者慎重地斟酌了很久:Java经过10多年的发展,已经成为世界上应用最广泛的编程语言,而且Java语言的强大是有目共睹的。功能如此丰富、强大,历史如此悠久的一门编程语言,如果希望通过一本三、四百页的书能讲透,笔者觉得不太现实。虽然笔者也很希望对《疯狂Java讲义》进行精简,但实在难以取舍。如果把《疯狂Java讲义》拆分成上、下册来出版,这种做法会增加读者的经济负担(1本书变成了2本书,总价会高很多)。后来出版社的朋友启发说:可以尝试把《疯狂Java讲义》部分内容抽取成“精粹本”;又想到有高校老师反应:学校在安排Java课程之前,已经安排了数据库开发相关课程,《疯狂Java讲义》中关于SQL、JDBC编程的内容有些重复。出于上面两种需求,笔者对《疯狂Java讲义》内容进行了调整,删除了部分内容,得到这本《疯狂Java讲义精粹》,本书更适合作为高校教材使用。

在以“疯狂Java体系”图书为教材的疯狂软件教育中心(www.fkjava.org)里,经常有学生询问:为什么叫疯狂Java这个名字?也有一些读者通过网络、邮件来询问这个问题。其实这个问题答案可以在本书第1版的前言中找到。疯狂的本质是一种“享受编程”的状态。在一些不了解编程的人看来:编程的人总面对着电脑、在键盘上敲打,这种生活实在太枯燥了,但实际上是因为他们并未真正了解编程,并未真正走进编程。在外人眼中:程序员不过是在敲打键盘;但在程序员心中:程序员敲出的每个字符,都是程序的一部分。

程序是什么呢?程序是对现实世界的数字化模拟。开发一个程序,实际是创造一个或大或小的“模拟世界”。在这个过程中,程序员享受着“创造”的乐趣,程序员沉醉在他所创造“模拟世界”里:疯狂地设计、疯狂地编码实现。实现过程不断地遇到问题,然后解决它;不断地发现程序的缺陷,然后重新设计、修复它——这个过程本身就是一种享受。一旦完全沉浸到编程世界里,程序员是“物我两忘”的,眼中看到的、心中想到的,只有他正在创造的“模拟世界”。

在学会享受编程之前,编程学习者都应该采用“案例驱动”的方式,学习者需要明白程序的作用是:解决问题——如果你的程序不能解决你自己的问题,如何期望你的程序去解决别人的问题呢?那你的程序的价值何在?——知道一个知识点能解决什么问题,才去学这个知识点,而不是盲目学习!因此本书强调编程实战,强调以项目激发编程兴趣。

仅仅只是看完这本书,你不会成为高手!在编程领域里,没有所谓的“武林秘笈”,再好的书一定要配合大量练习,否则书里的知识依然属于作者,而读者则仿佛身入宝山而一无所获的笨汉。本书配合了大量高强度的练习,希望读者强迫自己去完成这些项目。这些习题的答案可以参考本书所附光盘中《疯狂Java实战演义》的配套代码。如果需要获得编程思路和交流,可以登录http://www.crazyit.org与广大读者和笔者交流。本书有什么特点

本书是《疯狂Java讲义》的精粹版,本书并不是一本简单的Java入门教材。本书的内容完全取自《疯狂Java讲义》,只是删减了原书中关于SQL、JDBC编程,以及Java图形界面编程的相关内容。

因此,本书具有如下三个特点。

1.阐述透彻、原理清晰

本书并不是简单地罗列Java语法规则,而是尽量从语法设计者的角度向读者解释每个语法规则的作用、缘由;本书力求从运行机制来解释代码的运行过程,从内存分配的细节上剖析程序的运行细节。阅读本书不仅要求读者知道怎么做,而且要求读者能理解“为什么这么做”。

2.再现李刚老师课堂氛围

本书的内容是笔者6年多授课经历的总结,知识体系取自疯狂Java实战的课程体系。

本书力求再现笔者的课堂氛围:以浅显比喻代替乏味的讲解,以疯狂实战代替空洞的理论。

书中包含了大量“注意”、“学生提问”部分,这些正是上千个Java学员所犯错误的汇总。

3.注释详细,轻松上手

为了降低读者阅读的难度,书中代码的注释非常详细,几乎每两行代码就有一行注释。不仅如此,本书甚至还把一些简单理论作为注释穿插到代码中,力求让读者能轻松上手。

本书所有程序中关键代码以粗体字标出,也是为了帮助读者能迅速找到这些程序的关键点。本书写给谁看

如果你仅仅想对Java有所涉猎,那么本书并不适合你;如果你想全面掌握Java语言,并使用Java来解决问题、开发项目,或者希望以Java编程作为你的职业,那么本书将非常适合你。希望本书能引爆你内心潜在的编程激情,如果本书能让你产生废寝忘食的感觉,那笔者就非常欣慰了。2011-12-17第1章 Java语言概述本章要点

●Java语言的发展简史

●Java语言各竞争对手的情况

●编译型语言和解释型语言

●Java语言的编译、解释运行机制

●通过JVM实现跨平台

●安装JDK

●设置PATH环境变量

●编写、运行Java程序

●Java程序的组织形式

●Java程序的命名规则

●初学者易犯的错误

●Java的垃圾回收机制

Java语言历时十多年,已发展成为人类计算机史上影响深远的编程语言,从某种程度上来看,它甚至超出了编程语言的范畴,成为一种开发平台,一种开发规范。更甚至于:Java已成为一种信仰,Java语言所崇尚的开源、自由等精神,吸引了全世界无数优秀的程序员。事实是,从人类有史以来,从来没有一门编程语言能吸引这么多的程序员,也没有一门编程语言能衍生出如此之多的开源框架。

Java语言是一门非常纯粹的面向对象编程语言,它吸收了C++语言的各种优点,又摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,很好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程开发。

不仅如此,Java语言相关的Java EE规范里包含了时下最流行的各种软件工程理念,各种先进的设计思想总能在Java EE规范、平台以及相关框架里找到相应实现。从某种程度上来看,学精了Java语言的相关方面,相当于系统地学习了软件开发相关知识,而不是仅仅学完了一门编程语言。

时至今日,大部分银行、电信、证券、电子商务、电子政务等系统或者已经采用Java EE平台构建,或者正在逐渐过渡到采用Java EE平台来构建,Java EE规范是目前最成熟的,也是应用最广的企业级应用开发规范。1.1 Java语言的发展简史

Java语言的诞生具有一定的戏剧性,它并不是经过精心策划、制作,最后产生的划时代产品,从某个角度来看,Java语言的诞生完全是一种误会。

1990年年末,Sun公司预料嵌入式系统将在未来家用电器领域大显身手。于是Sun公司成立了一个由James Gosling领导的“Green计划”,准备为下一代智能家电(如电视机、微波炉、电话)编写一个通用控制系统。

该团队最初考虑使用C++语言,但是很多成员包括Sun的首席科学家Bill Joy,发现C++和可用的API在某些方面存在很大问题。而且工作小组使用的是嵌入式平台,可用的系统资源极其有限。并且很多成员都发现C++太复杂,以致很多开发者经常错误使用。而且C++缺少垃圾回收系统、可移植性、分布式和多线程等功能。

根据可用的资金,Bill Joy决定开发一种新语言,他提议在C++的基础上,开发一种面向对象的环境。于是,Gosling试图通过修改和扩展C++的功能来满足这个要求,但是后来他放弃了。他决定创造一种全新的语言:Oak。

到了1992年的夏天,Green计划已经完成了新平台的部分功能,包括Green操作系统、Oak的程序设计语言、类库等。同年11月,Green计划被转化成“FirstPerson有限公司”,一个Sun公司的全资子公司。

FirstPerson团队致力于创建一种高度互动的设备。当时代华纳公司发布了一个关于电视机顶盒的征求提议书时,FirstPerson改变了他们的目标,作为对征求提议书的响应,提出了一个机顶盒平台的提议。但有线电视业界觉得FirstPerson的平台给予用户过多的控制权,因此FirstPerson的投标败给了SGI。同时,与3DO 公司的另外一笔关于机顶盒的交易也没有成功。此时,可怜的Green项目几乎接近夭折,甚至Green项目组的一半成员也被调到了其他项目组。

正如中国古代的寓言所言:塞翁失马,焉知非福?如果Green项目在机顶盒平台投标成功,也许就不会诞生Java这门伟大的语言了。

1994年夏天,互联网和浏览器的出现不仅给广大互联网的用户带来了福音,也给Oak语言带来了新的生机。Gosling立即意识到,这是一个机会,于是对Oak进行了小规模的改造,到了1994年秋,小组中的Naughton和Jonathan Payne完成了第一个Java语言的网页浏览器:WebRunner。Sun公司实验室主任Bert Sutherland和技术总监Eric Schmidt观看了该浏览器的演示,对该浏览器的效果给予了高度评价。当时Oak这个商标已被别人注册,于是只得将Oak更名为Java。

Sun公司在1995年年初发布了Java语言,Sun公司直接把Java放到互联网上,免费给大家使用。甚至连源代码也不保密,也放在互联网上向所有人公开。

几个月后,让所有人都大吃一惊的事发生了:Java成了互联网上最热门的宝贝。竟然有10万多人次访问了Sun公司的网页,下载了Java语言。然后,互联网上立即就有数不清的Java小程序(也就是Applet),演示着各种小动画、小游戏等。

Java语言终于扬眉吐气了,成为了一种广为人知的编程语言。

在Java语言出现之前,互联网的网页实质上就像是一张纸,不会有任何动态的内容。有了Java语言之后,浏览器的功能被扩大了,Java程序可以直接在浏览器里运行,可以直接与远程服务器交互:用Java语言编程,可以在互联网上像传送电子邮件一样方便地传送程序文件!

1995年,Sun虽然推出了Java,但这只是一种语言,如果想开发复杂的应用程序,必须要有一个强大的开发类库。因此,Sun在1996年年初发布了JDK 1.0。这个版本包括两部分:运行环境(即JRE)和开发环境(即JDK)。运行环境包括核心API、集成API、用户界面API、发布技术、Java虚拟机(JVM)五个部分;开发环境包括编译Java程序的编译器(即javac命令)。

接着,Sun在1997年2月18日发布了JDK 1.1。JDK 1.1增加了JIT(即时编译)编译器。JIT和传统的编译器不同,传统的编译器是编译一条,运行完后将其扔掉;而JIT会将经常用到的指令保存在内存中,当下次调用时就不需要重新编译了,通过这种方式让JDK在效率上有了较大提升。

但一直以来,Java主要的应用就是网页上的Applet以及一些移动设备。到了1996年年底,Flash面世了,这是一种更加简单的动画设计软件:使用Flash几乎无须任何编程语言知识,就可以做出丰富多彩的动画。随后Flash增加了ActionScript编程脚本,Flash逐渐蚕食了Java在网页上的应用。

从1995年Java的诞生到1998年年底,Java语言虽然成为了互联网上广泛使用的编程语言,但它并没有找到一个准确的定位,也没有找到它必须存在的理由:Java语言可以编写Applet,而Flash一样可以做到,而且更快,开发成本更低。

直到1998年12月,Sun发布了Java历史上最重要的JDK版本:JDK 1.2,伴随JDK 1.2一同发布的还有JSP/Servlet、EJB等规范,并将Java分成了J2EE、J2SE和J2ME三个版本。

➢J2ME:主要用于控制移动设备和信息家电等有限存储的设备。

➢J2SE:整个Java技术的核心和基础,它是J2ME和J2EE编程的基础,也是这本书主要介绍的内容。

➢J2EE:Java技术中应用最广泛的部分,J2EE提供了企业应用开发相关的完整解决方案。

这标志着Java已经吹响了向企业、桌面和移动3个领域进军的号角,标志着Java已经进入Java 2时代,这个时期也是Java飞速发展的时期。

在Java 2中,Java发生了很多革命性的变化,而这些革命性的变化一直沿用到现在,对Java的发展形成了深远的影响。直到今天,我们还经常看到J2EE、J2ME等名称。

不仅如此,JDK 1.2还把它的API分成了三大类。

➢核心API:由Sun公司制定的基本的API,所有的Java平台都应该提供。这就是我们平常所说的Java核心类库。

➢可选API:这是Sun为JDK提供的扩充API,这些API因平台的不同而不同。

➢特殊API:用于满足特殊要求的API。如用于JCA和JCE的第三方加密类库。

2002年2月,Sun发布了JDK历史上最为成熟的版本:JDK 1.4。此时由于Compaq、Fujitsu、SAS、Symbian、IBM等公司的参与,使JDK 1.4成为发展最快的一个JDK版本。到JDK 1.4为止,我们已经可以使用Java实现大多数的应用了。

在此期间,Java语言在企业应用领域大放异彩,涌现出大量基于Java语言的开源框架:Struts、WebWork、Hibernate、Spring等;大量企业应用服务器也开始涌现:WebLogic、WebSphere、JBoss等,这些都标志着Java语言进入了飞速发展时期。

2004年10月,Sun发布了万众期待的JDK 1.5,同时,Sun将JDK 1.5改名为Java SE 5.0,J2EE、J2ME也相应地改名为Java EE和Java ME。JDK 1.5增加了诸如泛型、增强的for语句、可变数量的形参、注释(Annotations)、自动拆箱和装箱等功能;同时,也发布了新的企业级平台规范,如通过注释等新特性来简化EJB的复杂性,并推出了EJB 3.0规范。还推出了自己的MVC框架规范:JSF,JSF规范类似于ASP.NET的服务器端控件,通过它可以快速地构建复杂的JSP界面。

2006年12月,Sun公司发布了JDK 1.6(也被称为Java SE 6)。一直以来,Sun公司维持着大约2年发布一次JDK新版本的习惯。

但在2009年4月20日,Oracle宣布将以每股9.5美元的价格收购Sun,该交易的总价值约为74亿美元。而Oracle通过收购Sun公司获得了两项软件资产:Java和Solaris。

于是曾经代表一个时代的公司:Sun终于被“雨打风吹”去,“江湖”上再也没有了Sun的身影。多年以后,在新一辈的程序员心中可能会遗忘曾经的Sun公司,但老一辈的程序员们将永久地怀念Sun公司的传奇。

Sun倒下了,不过Java的大旗依然“猎猎”作响。2007年11月,Google宣布推出一款基于Linux平台的开源手机操作系统:Android。Android的出现顺应了即将出现的移动互联网潮流,而且Android系统的用户体验非常好,因此迅速成为手机操作系统的中坚力量。Android平台使用了Dalvik虚拟机来运行.dex文件,Dalvik虚拟机的作用类似于JVM虚拟机,只是它并未遵守JVM规范而已。Android使用Java语言来开发应用程序,这也给了Java语言一个新的机会。在过去的岁月中,Java语言作为服务器端编程语言,已经取得了极大的成功;而Android平台的流行,则让Java语言获得了在客户端程序上大展拳脚的机会。

2011年7月28日,Oracle公司终于“如约”发布了Java SE 7——这次版本升级经过了将近5年时间。Java SE 7也是Oracle发布的第一个Java版本。Java SE 7虽然并未完全满足所有人的期望,不过它也加入了不少新特性,本书后面将会详细介绍这些新特性。1.2 Java的竞争对手及各自优势

Java语言目前是最流行的面向对象编程语言,与Java类似的程序设计语言还有C#、Ruby 和Python等,它们在某些方面有自己的独特优势,因此都是Java语言有力的竞争者。1.2.1 C#简介和优势

当年Microsoft也一度加入到Java语言阵营中,Microsoft曾经在Visual Studio中提供了Visual J++。正当Microsoft尽力在Visual J++基础上拓展Java功能,并使之与Windows操作系统紧密结合在一起时,Sun公司对Microsoft提出法律诉讼,称其违反了Java许可证协议中的条款,最终的结果是微软公司不得不停止Visual J++产品的开发。1998年10月以来,Microsoft就不再发布新的Visual J++版本,而且导致Microsoft一直站在Java阵营的对立面,甚至在Windows XP系统中不再提供Java运行时环境的支持。

接下来,Microsoft推出了.NET平台,并发布了C#语言,无论从哪个角度来看,C#程序设计语言都是Microsoft对Java语言的反击。自C#诞生之日起,关于C#与Java之间的论战便此起彼伏,至今不辍。从技术的角度来看,C#与Java都是对传统面向对象程序设计在组件化软件时代的革新成果,可谓殊途同归,两种编程语言甚至有“90%的重叠”。

Java和C#都对传统C++艰深、晦涩的语法和语义进行了改进。在语法方面,两者都摒弃了C++中函数及其参数的const修饰、宏代换、全局变量和全局函数等华而不实的地方;在继承方面,两者都采用了更易于理解的单继承和多接口的实现方案;在源代码组织方面,都提出了声明与实现于一体的逻辑封装。

相对于Java语言,C#也有其独特的优势:Microsoft提供的Visual Studio开发平台可以极好地提高C#程序的开发效率,而且Microsoft要比Java更善于利用Windows平台,当使用C#创建Windows服务、记录Windows事件日志、访问Windows注册表时,.NET确实更方便。Microsoft提供了Windows任务相关的大量基类,允许程序员通过向导、拖放等操作来快速开发应用,因此比较容易使用。

Java的设计宗旨独立于任何平台,自然不会提供太多的Windows特性。但这也正是Java语言的优势:跨平台。对于一个企业应用而言,永远无法确定这个应用需要在怎样的平台上运行,如果你一旦选择了C#语言,那么你的应用就只能局限在Windows 平台上。因此,对于一个开放式的企业应用而言,通常会选择Java作为开发语言,而不是选择C#。1.2.2 Ruby简介和优势

Ruby语言由日本人松本行弘(まつもとゆきひろ,英译:Yukihiro Matsumoto,外号Matz)于1993年起开始着手研发,经历2年时间,发布了Ruby语言的第一个版本:0.95版。据松本行弘的描述:他一直想发明一种语言,这种语言既能进行高效开发,又能让开发人员享受编程的快乐。

事实上,Ruby确实是一种非常简洁的解释型语言,一种纯粹的面向对象编程语言,甚至比Java更纯粹(在Java语言里,还有基本数据类型等不是对象的变量,但在Ruby语言里,一切都是对象)。除此之外,Ruby还提供了许多额外的便捷功能,比如闭包、迭代和集合等,这些都是为了达到Ruby语言创始人的梦想:让Ruby开发者能享受编程的快乐。

相对于Java语言而言,Ruby语言最大的特征就是简洁。首先,它是一种弱类型的语言,变量无须声明,变量没有类型,因此Ruby的变量可以保存任何类型的数据;其次,它还提供了强大的正则表达式支持,并支持运算符重载;除此之外,Ruby也提供了许多额外的便捷功能,比如闭包、代码块、迭代器和集合等。

Ruby语言还有一个重要的优点:它也是完全跨平台的,可以在任何操作系统上解释执行。

2004年,Ruby语言阵营里出现了一个优秀的MVC框架:Ruby On Rails,这个开发框架被宣传成现有企业框架的一个替代品。Ruby On Rails框架是一个真正意义上的敏捷开发框架,它提供了大量代码生成器,通过使用这些代码生成器可以极好地提高应用的开发效率。

相对于Java领域的众多开发框架而言,Ruby on Rails提供了一个“一站式”的解决方案,Ruby On Rails框架提供了Web层的MVC框架、持久层的ORM等解决方案。借助于Ruby这种动态语言的优势,整个应用的代码相当简洁,因而使得Ruby On Rails应用的开发非常快速。

关于Rails框架和Java EE平台,其实是各有优势的。Rails平台的简洁性、易用性会在中小型应用上发挥出更大的吸引力;但Java EE平台则提供了更多的选择,适合对技术有精准把握的开发者,用于解决有复杂需求的大型企业级应用。1.2.3 Python简介和优势

Python由Guido于1989年年底开发,Python语言是基于ABC教学语言的。ABC这种语言非常优美和强大,是专门为非专业程序员设计的。但是,ABC语言并没有获得广泛的应用,Guido 认为是非开放造成的。

Guido决心在Python中避免这一错误,因此Guido加强了Python和其他语言如C、C++和Java的结合性。同时,他还实现了许多ABC中闪现过但未曾实现的东西。Python的第一个实现是基于Mac机的。Python由ABC语言发展而来,主要受到了Modula-3(另一种相当优美且强大的语言,为小型团体所设计)的影响,并且结合了UNIX shell和C的习惯。

Python是一种面向对象的解释型编程语言,也是一种功能强大而完善的通用型语言,已经具有十多年的发展历史,成熟且稳定。Python 具有脚本语言中最丰富和强大的类库,足以支持绝大多数日常应用。Python语言具有简洁而清晰的语法特点,适合完成各种高层任务,几乎可以在所有的主流操作系统上运行。

虽然Python也是一种解释型的脚本语言,但一些大规模的软件开发计划,比如Zope、Mnet、BitTorrent和Google都广泛地使用了该语言,而Python的支持者喜欢称它为高级动态编程语言,因此Python绝非JavaScript等只能处理简单任务的脚本语言所能比拟的。

Python的两大特色是可扩展性和清晰的语法。Python新的内置模块(module)可以用C 或 C++写成,也可为现成的模块加上Python的接口。Python的设计者在设计它的时候认为:对于一个特定的问题,只要有一种最好的方法来解决就好了。因此,Python甚至不是一种格式自由的语言,例如,它要求if语句的下一行必须向右缩进,否则不能通过编译。

Python在编程领域的占有率一直处于稳步上升之中,根据最新的数据,Python排名第七。前六名分别是Java、C、VB、C++、PHP和Perl。最近,微软也将Python纳入.NET平台,相信Python的未来会更好。1.3 Java程序运行机制

Java语言是一种特殊的高级语言,它既具有解释型语言的特征,也具有编译型语言的特征,因为Java程序要经过先编译,后解释两个步骤。1.3.1 高级语言的运行机制

计算机高级语言按程序的执行方式可以分为编译型和解释型两种。

编译型语言是指使用专门的编译器,针对特定平台(操作系统)将某种高级语言源代码一次性“翻译”成可被该平台硬件执行的机器码(包括机器指令和操作数),并包装成该平台所能识别的可执行性程序的格式,这个转换过程称为编译(Compile)。编译生成的可执行性程序可以脱离开发环境,在特定的平台上独立运行。

有些程序编译结束后,还可能需要对其他编译好的目标代码进行链接,即组装两个以上的目标代码模块生成最终的可执行性程序,通过这种方式实现低层次的代码复用。

因为编译型语言是一次性地编译成机器码,所以可以脱离开发环境独立运行,而且通常运行效率较高;但因为编译型语言的程序被编译成特定平台上的机器码,因此编译生成的可执行性程序通常无法移植到其他平台上运行;如果需要移植,则必须将源代码复制到特定平台上,针对特定平台进行修改,至少也需要采用特定平台上的编译器重新编译。

现有的C、C++、FORTRAN、Pascal等高级语言都属于编译型语言。

解释型语言是指使用专门的解释器对源程序逐行解释成特定平台的机器码并立即执行的语言。解释型语言通常不会进行整体性的编译和链接处理,解释型语言相当于把编译型语言中的编译和解释过程混合到一起同时完成。

可以认为:每次执行解释型语言的程序都需要进行一次编译,因此解释型语言的程序运行效率通常较低,而且不能脱离解释器独立运行。但解释型语言有一个优势:跨平台比较容易,只需提供特定平台的解释器即可,每个特定平台上的解释器负责将源程序解释成特定平台的机器指令即可。解释型语言可以方便地实现源程序级的移植,但这是以牺牲程序执行效率为代价的。

现有的Ruby、Python等语言都属于解释型语言。

除此之外,还有一种伪编译型语言,如Visual Basic,它属于半编译型语言,并不是真正的编译型语言。它首先被编译成P-代码,并将解释引擎封装在可执行性程序内,当运行程序时,P-代码会被解析成真正的二进制代码。表面上看起来,Visual Basic可以编译生成可执行性的EXE文件,而且这个EXE文件也可以脱离开发环境,在特定平台上运行,非常像编译型语言。实际上,在这个EXE文件中,既有程序的启动代码,也有链接解释程序的代码,而这部分代码负责启动Visual Basic解释程序,再对Visual Basic代码进行解释并执行。1.3.2 Java程序的运行机制和JVM

Java语言比较特殊,由Java语言编写的程序需要经过编译步骤,但这个编译步骤并不会生成特定平台的机器码,而是生成一种与平台无关的字节码(也就是*.class文件)。当然,这种字节码不是可执行性的,必须使用Java解释器来解释执行。因此,我们可以认为:Java语言既是编译型语言,也是解释型语言。或者说,Java语言既不是纯粹的编译型语言,也不是纯粹的解释型语言。Java程序的执行过程必须经过先编译,后解释两个步骤,如图1.1所示。图1.1 执行Java程序的两个步骤

Java语言里负责解释执行字节码文件的是Java虚拟机,即JVM(Java Virtual Machine)。JVM是可运行Java字节码文件的虚拟计算机。所有平台上的JVM向编译器提供相同的编程接口,而编译器只需要面向虚拟机,生成虚拟机能理解的代码,然后由虚拟机来解释执行。在一些虚拟机的实现中,还会将虚拟机代码转换成特定系统的机器码执行,从而提高执行效率。

当使用Java编译器编译Java程序时,生成的是与平台无关的字节码,这些字节码不面向任何具体平台,只面向JVM。不同平台上的JVM都是不同的,但它们都提供了相同的接口。JVM是Java程序跨平台的关键部分,只要为不同平台实现了相应的虚拟机,编译后的Java字节码就可以在该平台上运行。显然,相同的字节码程序需要在不同的平台上运行,这几乎是“不可能的”,只有通过中间的转换器才可以实现,JVM就是这个转换器。

JVM是一个抽象的计算机,和实际的计算机一样,它具有指令集并使用不同的存储区域。它负责执行指令,还要管理数据、内存和寄存器。

提示:

JVM的作用很容易理解,就像我们有两支不同的笔,但需要把同一个笔帽套在两支不同的笔上,只有为这两支笔分别提供一个转换器,这个转换器向上的接口相同,用于适应同一个笔帽;向下的接口不同,用于适应两支不同的笔。在这个类比中,我们可以近似地理解两支不同的笔就是不同的操作系统,而同一个笔帽就是Java字节码程序,转换器角色则对应JVM。类似地,我们也可以认为JVM分为向上和向下两个部分,所有平台上的JVM向上提供给Java字节码程序的接口完全相同,但向下适应不同平台的接口则互不相同。

Sun公司制定的Java虚拟机规范在技术上规定了JVM的统一标准,具体定义了JVM的如下细节:

➢指令集

➢寄存器

➢类文件的格式

➢栈

➢垃圾回收堆

➢存储区

Sun公司制定这些规范的目的是为了提供统一的标准,最终实现Java程序的平台无关性。1.4 开发Java的准备

在开发Java程序之前,必须先完成一些准备工作,也就是在计算机上安装并配置Java开发环境,开发Java程序需要安装和配置JDK。1.4.1 下载和安装Java 7的JDK

JDK的全称是Java SE Development Kit,即Java标准版开发包,是Sun提供的一套用于开发Java应用程序的开发包,它提供了编译、运行Java程序所需的各种工具和资源,包括Java编译器、Java运行时环境,以及常用的Java类库等。

这里又涉及一个概念:Java运行时环境,它的全称是Java Runtime Environment,因此也被称为JRE,它是运行Java程序的必需条件。

一般而言,如果只是运行Java程序,我们可以只安装JRE,无须安装JDK。

注意

如果需要开发Java程序,则应该选择安装JDK;当然,安装了JDK之后,就包含了JRE,也可以运行Java程序。但如果只是运行Java程序,则需要在计算机上安装JRE,仅安装JVM是不够的。实际上,Sun网站上提供的就是JRE的下载,并不提供单独JVM的下载。

Sun把Java分为Java SE、Java EE和Java ME三个部分,而且为Java SE和Java EE分别提供了JDK和Java EE SDK(Software Development Kit)两个开发包,如果读者只需要学习Java SE的编程知识,则可以下载标准的JDK;如果读者学完Java SE之后,还需要继续学习Java EE相关内容,也可以选择下载Java EE SDK,有一个Java EE SDK版本里已经包含了最新版的JDK,安装Java EE SDK就包含了JDK。

本书的内容主要是介绍Java SE的知识,因此下载标准的JDK即可。下载和安装JDK请按如下步骤进行。

1 登录http://www.oracle.com/technetwork/java/javase/downloads/index.html页面,下载Java SE Development Kit的最新版本。笔者成书之时,JDK的最新版本是JDK 7,本书所有的案例也是基于该版本JDK的。

2 单击如图1.2所示页面的链接,进入JDK 7的下载页面。读者应根据自己的平台选择合适的JDK版本:对于Windows平台,可以选择Windows x86或Windows x64版本;对于Linux平台,则下载Linux平台的JDK。

3 下载成功后,得到一个jdk-7-windows-i586.exe文件,这是一个标准的EXE文件,可以通过双击该文件来运行安装程序。对于Linux平台上的JDK安装文件,只需为该文件添加可执行的属性,然后执行该安装文件即可。

4 开始安装后,第一个对话框询问是否同意Java的许可证协议,单击“接受”按钮,进入如图1.3所示的组件选择窗口。

大部分时候,并不需要安装所有组件。在图1.3中,笔者选择安装JDK的3个组件。

➢Java开发工具:这是JDK的核心,包括编译Java程序必需的命令工具。实际上,这个选项里已经包含了运行Java程序的JRE,这个JRE会安装在JDK安装目录的子目录里,这也是笔者不安装公共JRE的原因。图1.2 下载JDK的页面图1.3 安装JDK的必需组件

➢演示程序及样例:安装这个选项将会向机器中安装Oracle所提供的大量演示和示例代码,这些代码是初学者学习Java的入门级范例。

➢源代码:安装这个选项将会安装Java所有核心类库的源代码。

5 选择JDK的安装路径,系统默认安装在C:\Program Files\Java路径下,但笔者不推荐安装在有空格的路径下,这样可能导致一些未知的问题,建议直接安装在根路径下,例如图1.3所示的D:\Java\jdk1.7.0\。单击“下一步”按钮,等待安装完成。

安装完成后,可在JDK安装路径下看到如下的文件路径。

➢bin:该路径下存放了JDK的各种工具命令,常用的javac、java等命令就放在该路径下。

➢db:该路径是安装Java DB的路径。

➢demo:该路径下存放了JDK提供的演示代码,初学者可以参考这些演示代码。

➢jre:该路径下安装的就是运行Java程序所必需的JRE环境。

➢lib:该路径下存放的是JDK工具命令的实际执行程序,如果使用WinRAR打开lib路径下的tools.jar文件,将看到如图1.4所示的文件结构。图1.4 tools.jar压缩文件的文件结构

提示:

用于编译Java程序所使用的javac.exe命令同样也是使用Java编写的,这个类就是lib路径下tools.jar文件中sun\tools\javac路径下的Main类,JDK的bin路径下的javac.exe命令实际上仅仅是包装了这个Java类。不仅如此,bin路径下的绝大部分命令都是包装了tools.jar文件里的工具类。

➢sample:该路径下存放了JDK提供的一些简单示例代码,初学者可以参考这些示例代码。

➢src.zip:该压缩文件里存放的就是Java所有核心类库的源代码。

➢README和LICENSE等说明性文档。

在上面路径中,bin路径是一个非常有用的路径,这个路径下包含了编译和运行Java程序的javac和java两个命令。除此之外,还包含了appletviewer、jar等大量工具命令。本书的后面章节将会介绍该路径下的常用命令的用法。1.4.2 设置PATH环境变量

前面已经介绍过了,编译和运行Java程序必须经过两个步骤。

1 将源文件编译成字节码。

2 解释执行平台无关的字节码程序。

上面这两个步骤分别需要使用java和javac两个命令。启动Windows操作系统的命令行窗口(在“开始”菜单里运行cmd命令即可),在命令行窗口里依次输入java和javac命令,将看到如下输出:

这意味着我们还不能使用java和javac两个命令。这是因为:虽然我们已经在计算机里安装了JDK,而JDK的安装路径下也包含了java和javac两个命令,但计算机不知道到哪里去找这两个命令。

计算机如何查找命令呢?Windows操作系统根据Path环境变量来查找命令。Path环境变量的值是一系列路径,Windows操作系统将在这一系列的路径中依次查找命令,如果能找到这个命令,则该命令是可执行的;否则将出现“'xxx'不是内部或外部命令,也不是可运行的程序或批处理文件”的提示。而Linux操作系统则根据PATH环境变量来查找命令,PATH环境变量的值也是一系列路径。因为Windows操作系统不区分大小写,设置Path和PATH并没有区别;而Linux系统是区分大小写的,设置Path和PATH是有区别的,因此只需要设置PATH环境变量即可。

提示:

不管是Linux平台还是Windows平台,只需把java和javac两个命令所在的路径添加到PATH环境变量中,就可以编译和运行Java程序了。

1.4.2.1 在Windows XP、Windows 2003、Windows 7等平台上设置环境变量

右击桌面上“我的电脑”图标,出现右键菜单;单击“属性”菜单项,出现“系统属性”对话框;单击该对话框的“高级”Tab页,出现如图1.5所示的对话框。

单击“环境变量”按钮,将看到如图1.6所示的“环境变量”对话框,通过该对话框可以修改或添加环境变量。图1.5 “系统属性”对话框图1.6 “环境变量”对话框

如图1.6所示的对话框上面的“用户变量”部分用于设置当前用户的环境变量,下面的“系统变量”部分用于设置整个系统的环境变量。对于Windows系统而言,名为Path的系统环境变量已经存在,可以直接修改该环境变量,在该环境变量值后追加D:\Java\jdk1.7.0\bin(其中D:\Java\jdk1.7.0\是笔者JDK的安装路径)。实际上,笔者更喜欢添加用户变量,单击“新建”按钮,添加名为PATH的环境变量,设置PATH环境变量的值为D:\Java\jdk1.7.0\bin。

1.4.2.2 在Linux上设置环境变量

进入当前用户的home路径下,然后在home路径下输入如下命令:

该命令将列出当前路径下所有的文件,包括隐藏文件,Linux平台的环境变量是通过.bash_profile文件来设置的。使用无格式编辑器打开该文件,在该文件的PATH变量后添加:/home/yeeku/Java/jdk1.7.0/bin,其中/home/yeeku/Java/jdk1.7.0/是笔者的JDK安装路径。修改后的PATH变量设置如下所示:

Linux平台与Windows平台不一样,多个路径之间以冒号(:)作为分隔符,而$PATH则用于引用原有的PATH变量值。

完成了PATH变量值的设置后,在.bash_profile文件最后添加导出PATH变量的语句,如下所示:

重新登录Linux平台,或者执行如下命令:

两种方式都是为了运行该文件,让文件中设置的PATH变量值生效。1.5 第一个Java程序

本节将编写一个所有编程语言里最“著名”的程序:HelloWorld,以这个程序来开始我们的Java学习之旅。1.5.1 编辑Java源代码

编辑Java源代码可以使用任何无格式的文本编辑器,在Windows操作系统上可使用记事本(NotePad)、EditPlus等程序,在Linux平台上可使用VI工具等。

注意

编写Java程序不要使用写字板,更不可使用Word等文档编辑器。因为写字板、Word等工具是有格式的编辑器,当使用它们编辑一份文档时,这个文档中会包含一些隐藏的格式化字符,这些隐藏字符会导致程序无法正常编译、运行。

在记事本中新建一个文本文件,并在该文件中输入如下代码:程序清单:codes\01\1.5\HelloWorld.java文件

编辑上面的Java文件时,注意程序中粗体字标识的单词,Java程序严格区分大小写。将上面文本文件保存为HelloWorld.java,该文件就是Java程序的源程序。

编写好Java程序的源代码后,接下来就应该编译该Java源文件来生成字节码了。1.5.2 编译Java程序

编译Java程序需要使用javac命令,因为前面已经把javac命令所在的路径添加到了系统的PATH环境变量中,因此现在可以使用javac命令来编译Java程序了。

如果直接在命令行窗口里输入javac,不跟任何选项和参数,系统将会输出大量提示信息,用以提示javac命令的用法,读者可以参考该提示信息来使用javac命令。

对于初学者而言,先掌握javac命令的如下用法:

在上面命令中,-d destdir是javac命令的选项,用以指定编译生成的字节码文件的存放路径,destdir只需是本地磁盘上的一个有效路径即可;而srcFile是Java源文件所在的位置,这个位置既可以是绝对路径,也可以是相对路径。

通常,总是将生成的字节码文件放在当前路径下,当前路径可以用一点(.)来表示。在命令行窗口进入HelloWorld.java文件所在路径,在该路径下输入如下命令:

运行该命令后,在该路径下生成一个HelloWorld.class文件。

如果读者喜欢用EditPlus作为无格式编辑器,则可以使用EditPlus把javac命令集成进来,从而直接在EditPlus编辑器中编译Java程序,而无须每次启动命令行窗口。

在EditPlus中集成javac命令按如下步骤进行。

1 单击EditPlus的“工具”菜单,然后单击“配置用户工具”菜单项,弹出如图1.7所示的对话框。

2 单击“组名称”按钮来设置工具组的名称,例如输入“编译运行Java”。单击“添加工具”按钮,并选择“程序”选项,然后输入javac命令的用法和参数,输入成功后看到如图1.8所示的界面。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载