第一章Java语言的概述
1.1 Java语言的发展简史
Java语言的诞生具有一定的戏剧性,它并不是经过精心策划、制作,最后产生的划时代产品,从某角度来看,Java语言的诞生完全是一种误会。
1990年年末,Sun公司成立了一个由James Gosling领导的“Green 计划”,准备为下一代智能家电(如电视机、微波炉、电话)编写一个通用控制系统。
该团队最初考虑使用C++语言,但是很多成员包括Sun的首席科学家Bill Joy, 发现C++和可用的API在某些方面存在很大问题。而且工作小组使用是嵌入式平台,可用的系统资源极其有限。
根据可用的资金,Bill Joy决定开发一种新语言,他提议在C++的基础上,开发一种面向对象的环境。Gosling试图通过修改和拓展C++的功能来满足这个要求,但是后来他放弃了。他决定创造一种全新的语言:Oak。
1992年的夏天,由于有线电视业界觉得FirstPerson的平台给予用户过多的控制权,因此FirstPerson的的投标败给了SGI。同时,与3DO公司的另一笔有关于机顶盒的交一也没有成功,此时,可怜的Green项目几乎接近夭折。
1994年夏天,互联网和浏览器的出现不仅给广大互联网的用户带来了福音,也给Oak语言带来了新的生机。Gosling立即意识到,这是一个机会,于是对Oak进行了小规模的改造,到了1994年秋,小组中的Naughton 和 Jonathan Payne完成了第一个Java语言的网页浏览器:WebRunner。当时Oak这个商标已经被别人注册,于是只得将Oak更名为Java。
Sun公司在1995年年初发布了Java语言,Sun公司直接把Java放到互联网上,免费给大家使用。甚至连源代码也不保密,也放在互联网上向所有人公开。
几个月后,Java成了互联网上最热门的宝贝。Java语言终于扬眉吐气了,成为了以中国广为人知的编程语言。
1996年年初,Sun发布了JDK1.0。这歌版本包括两部分:运行环境(即JRE)和开发环境(即JDK)。运行环境包括核心API、集成API、用户界面API、发布技术、Java虚拟机(JVM)五个部分;开发环境包包括编译Java程序的编译器(即javac命令)。
接着,Sun在1997年2月18日发布了JDK 1.1。JDK 1.1新增了JIT(即时编译)编译器。
1998年12月,Sun发布了Java历史上最重要的JDK版本:JDK 1.2,伴随JDK 1.2一同发布的还有JSP/Servle、EJB等规范、并将Java分成了J2EE、J2SE和J2ME三个版本。
这标志着Java已经吹响了向企业、桌面和移动3个领域进军的号角,标志着Java已经进入Java2时代,这个时期也是Java飞速发展的时期。
不仅如此,JDK 1.2 还把它的API分成了三大类。核心API、可选API和特殊API。
2002年2月,Sun发布了JDK历史上最为成熟的版本:JDK 1.4。
2004年10月,Sun发布了万众期待的JDK1.5。同时,Sun将JDK 1.5改名为Java SE 5.0, J2EE、J2ME也相应地改名为Java EE和Java ME。
2006年12月,Sun公司给发布了JDK 1.6。
2009年4月20日,Oracle收购了Sun。
2011年7月28日,Oracle公司发布了Java SE 7。
1.2 Java的竞争对手及各自优势
Java语言目前是最流行的面向对象语言,与Java类似的程序设计语言还有C#、Ruby和Python等,它们在某些方面有自己的独特优势,因此都是Java语言有力的竞争者。
1.2.1 C#
Microsoft提供的Visual Studio开发平台可以极好地提高C#程序的开发效率,而且Microsoft要比Java更善于利用Windows平台。
Java的设计宗旨独立于任何平台,自然不会提供太多的Windows特性。但这也是Java语言的优势:跨平台。
1.2.2 Ruby
Ruby是一种非常简洁的解释性语言,一种纯粹的面向对象语言,甚至比Java更纯粹(在Java语言里,还有基本数据类型等不是对象的变量,但在Ruby语言里,一切都是对象)。
相对于Java语言而言,Ruby语言最大的特征就是简洁。
Ruby语言还有一个重要的有点:它也是完全跨平台的,可以在任何操作系统上解释执行。
关于Rails框架和Java EE平台,其实是各有优势的。Rails平台的简洁性、易用性会在中小型应用上发挥出更大的吸引力;但Java EE平台则提供了更多的选择,适合对技术由精准把握的开发者,用于解决有复杂需求的大型企业级应用。
1.2.3 Python
Python语言是基于ABC教学语言的。ABC这种语言非常优美和强大,是专门为非专业程序员设计的。
Python是一种面向对象的解释性编程语言,也是一种功能强大而完整的通用型语言。Python具有脚本语言中最丰富和强大的类库,足以支持绝大多数日常应用。Python语言具有简洁而清晰的语法特点,适合完成各种高层任务,几乎可以在所有主流操作系统上运行。
Python的两大特色是可扩展性和清晰的语法。
1.3Java程序运行机制
Java语言是一种特殊的高级语言,它既具有解释性语言的特则特征,也具有编译型语言的特征,因为Java程序要经过先编译,后解释两个步骤。
1.3.1高级语言的运行机制
计算机高级语言按程序的执行方式可以分为编译型和解释型两种。
编译型语言是指使用专门的编译器,针对特定平台(操作系统)将某种高级语言源代码一次性“翻译”成可被该平台硬件执行的机器码(包括机器指令和操作数),并包装成该平台所能识别的可执行性程序的格式,这个转换过程称为编译(Compile)。编译生成的可执行性程序可以脱离开发环境,在特定的平台上独立运行。
因为编译型语言是一次性地编译成机器码,所以可以脱离开发环境独立运行,而且通过运行效率较高;但因为编译型语言的程序被编译成特定平台上的机器码,因此编译生成的可执行性程序通常无法移植到其他平台上运行;如果需要移植,则必须将源代码复制到特定平台上,针对特定平台进行修改,至少也需要采用特定平台上的编译器重新编译。
现有的C、C++、FORTRAN、Pascal等高级语言都属于编译型语言。
解释性语言是指使用专门的解释器对源程序逐行解释成特定平台的机器码并立即执行的语言。
每次执行解释性语言的程序都需要进行一次编译,因此解释性语言的运行效率通常比较低,而且不能脱离解释器独立运行。但是解释型语言有一个优势:跨平台比较容易。
现有的Ruby、Python等语言都属于解释性语言。
除此之外,还有一种伪编译型语言,如Visual Basic,它属于半编译型语言。
1.3.2Java程序的运行机制和JVM
由Java语言编写的程序需要经过编译步骤,但这个编译步骤并不会生成特定平台的机器码,而是生成一种与平台无关的字节码(也就是*.class文件)。当然这种字节码不是可执行性的,必须使用Java解释器来解释。
Java语言里负责解释执行字节码文件的是Java虚拟机,即JVM(Java Virtual Machine)。 当使用Java编译器编译Java程序时,生成的是与平台无关的字节码,这些字节码不面向任何具体平台,只面向JVM。
JVM是一个抽象的计算机,和实际的计算机一样,它具有指令集并使用不通过的存储区域。它负责执行指令,还要管理数据、内存和寄存器。
Sun公司只当的Java虚拟机规范在技术上规定了JVM的统一标准,具体定义了JVM的如下细节:
- 指令集
- 寄存器
- 类文件的格式
- 栈
- 垃圾回收堆
- 存储区
Sun公司制定这些规范的目的是为了提供统一的标准,最终实现Java程序的平台无关性。
1.4开发Java的准备
在开发Java程序之前,必须先完成一些准备工作,也就是在计算机上安装并配置Java开发环境,开发Java程序需要安装和配置JDK。
1.4.1下载和安装Java7的JDK
JDK的全称是Java SE Development Kit,即Java标准开发包,是Sun提供的一套用于开发Java应用程序的开发包,他提供了编译、运行Java程序所需的各种工具和资源,包括Java编译器,Java运行时环境,以及常用的Java类库等。
Java运行时环境,它的全称时Java Runtime Environment,因此也被称为JRE,它时运行Java程序的必须条件。
一般而言,如果只是运行Java程序,我们可以只安装JRE,无需安装JDK。
安装完成后,可在JDK安装路径下看到如下的文件路径。
- bin:该路径下存放了JDK的各种工具命令,常用的 javac,Java等命令就放在该路径下。
- db:该路径是安装Java DB的路径
- demo:该路径下存放了JDK提供的演示代码,初学者可以参考这些演示代码。
- jre:该路径下安装的就是运行Java程序所必须的JRE环境。
- lib:该路径下存放的是JDK工具命令的实际执行程序。
- sample:该路径下存放了JDK提供的一些简单示例代码,初学者可以参考这些示例代码。
- src.zip:该压缩文件里存放的就是Java所有核心类库的源代码。
- README和LICENSE等说明性文档。
1.4.2设置PATH环境变量
编译和运行Java程序必须经过两个步骤。
1.将源文件编译成字节码。
2.解释执行平台无关的字节码程序。
上面这两个步骤分别需要使用java和javac两个命令。
(配置过程省略)
1.5第一个Java程序
编写所有编程语言里最“著名”的程序:HelloWorld。
1.5.1编辑Java源代码
编辑Java源代码可以使用任何无格式的文本编辑器,在Windows操作系统上可以使用记事本(NotePad)、EditPlus等程序,在Linux平台上可使用VI工具等。
public class HelloWorld{
public static void main(String[] args){
System.out.println(“Hello World!”);
}
}
Java程序严格区分大学写,将上面文本文件保存为HelloWorld.java,该 文件就是Java程序的源文件。
1.5.2编译Java程序
javac -d destdir srcFile
在上面的命令中,-d destdir是javac命令的选项,用以指定编译生成的字节码文件的存放路径,destdir只需是本地磁盘上的一个有效路径即可;而srcFile是Java源文件所在的位置,这个位置既可以是绝对路径,也可以是相对路径。
通常,总是将生成的字节码文件放在当前路径下,当前路径可以用一点(.)来表示。例如:
javac -d . HelloWorld.java
运行该命令后,在该路径下生成一个HelloWorld.class文件。
1.5.3运行Java程序
在命令行输入
java HelloWorld
就能看到如下输出:
Hello World!
这表明Java程序运行成功。
Java命令和程序必须严格区分大小写。
1.5.4根据CLASSPATH环境变量定位类
实际上,如果使用1.5以上版本的JDK,完全可以不用设置CLASSPATH环境变量——正如上面编译,运行Java程序所见到的。
那么CLASSPATH环境变量的作用是什么呢?当使用“Java Java类名“命名来运行Java程序时,JRE到哪里去搜索Java类呢?当然时当前路径下啊,但是在1.4以前版本的JDK都没有设计这个功能,这意味着即使当前路径已经包含了HelloWorld.class,并在当前路径下执行“java HelloWorld”,系统将一样提示找不到HelloWorld类。
如果使用1.4以前版本的JDK,则需要JDK的lib路径下dt.jar和tools.jar文件中的Java类,因此还需要把这两个文件添加到CALSSPATH环境变量里。
即:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar(其中JAVA_HOME环境变量应指向JDK的安装目录)。
后来的JRE会自动搜索当前路径下的类文件,因此不需要设置CLASSPATH环境变量。
当然,及时使用JDK1.5以上版本的JDK,也可以设置CLASSPATH环境变量,一旦设置了该环境变量,JRE将会按该环境变量指定的路径来搜索Java类。
1.6Java程序的基本规则
1.6.1Java程序的组织形式
Java程序是一种纯粹的面向对象的程序设计语言,因此Java程序必须以类(class)的形式存在,类(class)时Java程序的最小程序单位。Java程序不允许可执行性语句、方法等成分独立存在,所有的程序部分都必须放在类定义里。
class Test{
}
这时一个最简单的Java程序,这个程序定义了一个Test类,这个类里没有任何的类成分,是一个空类,但这个Java程序时绝对正确的。
当然这个程序不能被java命令解释执行,他没有main方法,它会给你错误提示,但这并不代表这个类是错误的。
1.6.2Java源文件的命名规则
- Java程序源文件的后缀必须是.java,不能是其他文件后缀名。
- 在通常情况下,Java程序源文件的主文件铭可以是任意的,但有一种情况例外:如果Java程序源代码里定义了一个public类,则该源文件的主文件名必须与该public类(也就是该类定义使用了public关键字修饰)的类名相同。
由于Java程序源文件的文件名必须与public类的类名相同,因此,一个Java源文件里最多智能定义一个public类。
建议:
- 一个Java源文件值定义一个类,不同的类使用不同的源文件定义。
- 让Java源文件的主文件名与该源文件中定义的public类同名。
1.7垃圾回收机制
与C/C++程序不同,Java语言不需要程序员直接控制内存回收,Java程序的内存分配和回收都是由JRE在后台自动进行的。
1.8何时开始使用IDE工具
对于Java语言的初学者而言,作者提出了一个忠告:不要使用任何IDE工具来学习Java编程,Windows平台上可以选择记事本,Linux平台上可以选择使用VI工具。如果嫌Windows上的记事本的颜色太单调,可以选择使用EditPlus或者和UltraEdit。
哪儿买何时开始使用IDE工具呢?标准是:如果倪还离不开这个IDE工具,那你就不能使用这个IDE工具,只有当你十分清楚IDE工具里单击的每一个菜单,单击的每一个按钮------IDE工具在底层为你做的每个细节时,你才可以使用IDE工具!
如果读者有志于称为一个优秀的Java程序员,那么,到了更高层次后,就不可避免地需要自己开发IDE工具地插件(例如开发Eclipse插件),定制自己的IDE工具,甚至负责开发整个团队地开发平台,这些都要求开发者对Java开发的细节非常熟悉。因此,不要从IDE工具开始学习。
本章练习
1.搭建自己的Java开发环境
2.编写Java语言的 HelloWorld。