[toc]
第1章 Java平台概论
1.1 Java不止是语言
从1995年至今,Java已经过20个年头,经过这些年的演进,Java已不仅是程序语言,也代表了解决问题的平台,更代表了原厂、各个厂商、社群、开发者与用户沟通的成果。
1.1.1 前世今生
1. Java的诞生
Java最早是Sun公司绿色项目Green Project中撰写Star7应用程序的程序语言,当时名称不是Java,而是取名Oak。
绿色项目始于1990年12月,由Patrick Naughton、Mike Sheridan与James Gosling(默然说话:呀,我最崇敬的人物:Java他爹)主持,目的是希望构筑出下一波计算机应用趋势并加以掌握,他们认为下一波计算机应用趋势会集中在消费性数字产品的使用上。(默然说话:在1990年预测到20年后的今天计算机将如何被使用,实在是有点不可思议,同时也是一种悲哀。因为在当时,由于互联网的不发达,今天的一切都是无法进行的,这就造成你所预言的技术无法在现实中被大量使用。英雄无用武之地,不是么?)
1993年第一个万维网浏览器Mosaic诞生(默然说话:如果我没弄错,它应该是现在非常流行的火狐浏览器的前身,包括谷歌浏览器,苹果浏览器都有它的身影),James Gosling认为互联网与Java的一些特性不谋而合,利用Java Applet在浏览器上展现多媒体是一件非常酷的事情,于是绿色项目小组仿照Mosaic使用Java语言开发出了浏览器WebRunner(原名BladeRunner,(默然说话:大家可以查下Blade这个单词是啥意思,实在是太刺激了),后来改名为HotJava,虽然只是一个展示性产品,但它却立即吸引了许多人的注意。
1995年5月23日(这一天被公认为Java的诞生日),正式将Oak改名为Java,Java Development Kits(JDK全名)1.0a2版本正式对外发表。1996年之后各主流浏览器(默然说话:其实就2个,IE和NN,而NN已经倒闭了,历史呀,说起来都是泪。)都正式支持Java,从此Java在互联网上逐渐风行起来。虽然Star7死了,绿色项目也死了,可Java却奇迹般的依托互联网活了下来。
2. 版本演进
Java得到了Sun、微软、IBM等大公司的支持。1998年Sun与微软分裂,自己发布了Java 2 Platform,简称J2SE1.2,而微软继续了J#。Sun公司的J2SE开发者版本一开始就简称为JDK,到如今仍然叫这个名字。
而微软的J#似乎成了阑尾,因为微软公司重点放在了C#上,所以后来就是Sun公司和IBM公司有各自独立实现的版本。
J2SE约以2年为周期推出重大版本更新,1998年12月4日发表1.2,2000年5月8日发表1.3,2002年2月13日发表1.4。
04年9月29日发表的1.5不再称为1.5,产品名称也不再称为J2SE,这是为了彰显这个版本与之前版本有极大不同,如语法上的简化、泛型、枚举、注解等重大功能的添加均使其具有划时代的意义(默然说话:其实就是抄袭C#较为成功吧,因为这些东西C#4.0中已经有了完整的实现,且已经发布了一段时间了),所以更名为Java SE 5.0(默然说话:额滴神呀,不是1.5,而是5.0!这可是小数点的变化!你们知道这意味着什么?知道么?真的知道么!)
3. 江山易主
Java SE 6之后,Java开发人员足足等了四年多,天残版1.7才出现。这不禁让人想问:Java怎么了?
关键问题是Sun营收低迷不振,严重影响了新版本的推动,在2010年年中与IBM密谈并购失败之后,Oracle宣布并购Sun,Java的蓝色,也开始变成了Oracle的红色。
在2010年底JCP终于通过了Java SE 7与Java SE 8的发布路线图,于2011年7月28日发布了7.
到2014年3月18日,Java SE 8发布。
1.1.2 三大平台
在Java发展的过程中,由于Java的应用领域越来越广,并逐渐扩及至各级应用软件的开发,Sun公司在1999年6月美国旧金山的Java One大会上,公布了新的Java体系架构,该架构根据不同级别的应用开发区分了不同的应用版本:J2SE(Java 2 Platform, Standard Edition)、J2EE(Java 2 Platform, Enterprise Edition)与J2ME(Java 2 Platform, Micro Edition)。
J2SE、J2EE与J2MEj当时的名称,由于Java SE 5(默然说话:原书写的是Java SE 6之后,这明显是不对的,因为这段历史我是经历者,我亲眼在网站上看到,从1.5开始,下载页面的名称从原来的J2SE 1.5更改为Java SE 5,帮助文档也同样做了更名)后Java不再带有2。J2SE、J2EE和J2ME分别被更名为Java SE、Java EE和Java ME。
1. Java SE
Java是各应用平台的基础,想要学习其他的平台应用,必先了解Java SE以奠定基础,Java SE也正是本书主要的介绍对象。
Java SE可以分为四个主要的部分:JVM、JRE、JDK与Java语言。
为了能够运行Java撰写好的程序,必须有Java虚拟机(Java Virtual Machine,JVM)。JVM包括在Java执行环境(JRE)中,所以为了要运行Java程序,必须安装JRE。如果要开发Java程序,必须取得JDK,JDK包括JRE及开发过程中需要的一些工具程序,像Javac、java等(关于JRE及JDK的安装与使用,会在第2章说明)。
Java语言只是Java SE的一部分,除了语言之外,Java最重要的就是提供庞大且强大的标准API,提供字符串处理、数据输入/输出、网络套件、用户窗口接口等功能,可以使用这些API作为基础来进行程序开发,无须重复开发功能相同的组件。事实上,在熟悉Java语言之后,更多的时候,都是在学习如何使用Java SE提供的API来组成应用程序。
2. Java EE
Java EE以Java SE为基础,适于开发基于Web的分布式应用程序,整个Java EE的体系是相当庞大的,像JSP、Servlet、EJB等服务或技术都是需要一本书来进行说明的,不过有一点可以确定,就是必须先奠定良好的Java SE基础,再来学习Java EE的开发
3. Java ME
Java ME是Java平台中最小的一个,上的是作为小型数字设备上开发及部署应用程序的平台(默然说话:感觉这个版本基本上算是完蛋了,因为现在手机开发已经被本地平台所取代,如Android自己的SDK,Objective-C)。
1.1.3 JCP与JSR
Java不仅是程序语言,还是标准规范。
Java由Sun创造,为了让对Java感兴趣的厂商、组织、开发者与用户参与定义Java未来的功能与特性,Sun公司于1998年成立了JCP(Java社区执行委员会),这是一个开放性国际组织,目的是让Java演进成为全世界数以百计代表成员公开监督的过程。
任何想要提议加入Java的功能或特性,必须以JSR(Java规范请求)正式文件的方式提交,JSR必须经过JCP投票通过,方可成为最终标准文件,有兴趣的厂商或组织可以根据JSR实现产品。
若JSR获得通过,被决定加入Java中,则必须做出免费且开放源代码的参考实现,称为RI(引用实现),并提供TCK(技术兼容性测试工具),方便于其他想根据JSR实现产品的厂商或组织参考与测试兼容性。
现在无论Java SE、Java EE还是Java ME,都是业界共同制定的标准,每个标准背后代表了业界所面临的一些问题,他们期待使用Java来解决问题,认为应该有某些组件、特性、API等,来解决这些问题,因而制定JSR作为正式标准规范文件,不同的技术解决方案标准规范会有一个编号。
Java SE 8的主要规范是在JSR337文件之中,而Java SE 8平台中的特定技术,则规范于特定的JSR文件中,若对这些文件有兴趣,可以参考以下网址:
http://jcp.org/en/jsr/detail?id=337
提示:JSR对于Java初学者而言过于艰涩,但jSR文件规范了相关技术应用的功能,将来有能力时,可以试着自行阅读JSR,这有助于了解相关技术规范的更多细节。
1.1.4 Oracle JDK与OpenJDK
2006年的JavaOne大会上,Sun宣告对Java开放源代码,从JDK 7开始有了OpenJDK,并于2009年4月15日正式发布OpenJDK。Oracle时代发布的JDK7正式版本,指定了OpenJDK7为官方参考实现。
1. Oracle JDK 7与OpenJDK7
与同为开放源代码的Sun JDK不同的是,Sun JDK采用JRL,而OpenJDK7采用GPL,前者源代码可用于个人研究使用,但禁止任何商业用途,后者则允许商业上的使用,因此,OpenJDK7必须删掉许多在两个授权间有冲突的程序代码,也不包括一些部署工具以及软件套件等。
2. Open JDK7与OpenJDK6
在OpenJDK官方网站,也可以看到OpenJDK6的版本,OpenJDK6并不是Sun JDK6的分支,而是将OpenJDK7中JDK7的特性删掉,使之符合JDK6的规范,因而OpenJDK6实际上是OpenJDK7的分支,OpenJDK6可以通过TCK兼容性测试。
Oracle从2012年7月以来,就打算结束对JDK6的支持,在2013年2月时宣布JDK6Update 43时,宣布这是最后一个免费更新版本(实际后来还有Update 45),希望大家赶快升级至JDK7.
1.1.5 建议的学习路径
在Java的官方网站提供有一份Java技术观念图的文件,这是份PDF,可以在以下网址下载:
http://www.oracle.com/technetwork/topics/newtojava/intro-142494.html
以下是基于经验与教学建议的学习路径。
第一章 深入了解JVM/JRE/JDK
第二章 理解封装、继承、多态
第三章 掌握常用Java SE API架构
第四章 学习容器的观念
第五章 研究开放源代码项目
第六章 学习设计模式与重构
第七章 熟悉相关开发工具
1.2 JVM/JRE/JDK
1.2.1 什么是JVM
Java Virtual Machine(JVM)会架构在Solaris、Linux、Windows各种操作系统平台之上。许多Java书都会告诉你,JVM让Java可以跨平台,但是跨平台是怎么一回事?
对于计算机而言,我们要知道它只认识一种语言,就是0、1序列组成的机器指令。当使用C/C++等高级语言撰写程序时,其实这些语言为了方便人类理解,是以英文的文法来进行编写的,计算机是直接看不懂的,所以需要一个翻译将它们翻译成0、1序列。担任翻译员工作的就是编译程序(Compiler)。
而要知道的是,计算机只要有一个小型号的变化,0、1序列就会不一样。这样一来,某个指令在Windows上是0101,在Linux下却可能是1010,因此必须使用不同的编译程序为不同平台编译出可执行的机器码,这样一来,编译好的代码只能在一个指定的平台下运行,如果需要在另一个平台上运行,必须重新进行编译(默然说话:这叫可移植,但不是跨平台)。
而Java采用了另一种方式。编译器编译Java代码时并不直接编译为0、1序列,而是翻译为一种称为“字节码”的中间形式。然后再由JVM在运行时将字节码编译为0、1序列进行执行。
Java源代码扩展名为.java,经过编译程序翻译为扩展名为.class。如果想要执行class文件,必须安装JVM,JVM会将字节码翻译为对应平台的机器码。编写Java程序时,对JVM的重要认识就是:
对Java程序而言,只认识一种系统就够了,这个系统就是JVM,而字节码文件(后缀为.class的文件)就是JVM的可执行文件。
理论上Java程序并不用理会真正执行于哪个平台,只要知道如何执行于JVM就可以了。至于JVM实际上如何与底层平台沟通,则是JVM自己的事。由于JVM实际上就是Java程序的执行环境,所以JVM负责了Java程序的各种资源管理。
1.2.2 区分JRE与JDK
Java Runtime Environment就是Java执行环境,简称JRE,包括Java SE API与JVM。只要使用Java SE API中的链接库,在安装有JRE的计算机上就可以直接运行,无须额外在程序中再包装链接库,而可以由JRE直接提供。
如果要在.java中撰写Java程序,使用编译程序编译为.class,像编译程序这样的工具程序是由JDK提供的,全称Java Development Kit。
JDK包括了javac、appletviewer、javadoc等工具程序,对于要开发Java程序的人,必须安装JDK,这样才编译Java程序或使用这些工具,JDK同时还包括了JRE,所以还能执行Java程序。总起来:JDK包括了Java程序、工具程序和JRE,JRE包括部署技术、Java SE API和JVM。
Java JDK的确很不友好,因为JDK的安装很简单,但要使用却是很麻烦的事情,你需要对系统进行很多的设置,如果是一个对电脑也只能算是初通的初学者来进行学习,会在一开始就遇到很多困难,但是当你能克服这些困难完成配置之后,你会发现你学会了很多意外的知识,这就是Java的哲学:如果不是对编程酷爱,请不要来碰我,这会造成你太大的困扰,如果你除了激情之外,还有对困难的无视与一往直前,请拥抱我,我会给你真心的回报!
1.2.3 下载、安装JDK
要下载JDK,请链接到(Java SE Download)以下网址:
http://www.oracle.com/technetwork/java/javase/downloads/index.html
如果你要下载的是Java SE 8中的JDK,按照以往惯例,发布JDK之后,每隔二到三个月会针对用户反馈的bug或安全问题进行修正,并发布一个修正版JDK。一般你所下载的页面上应该显示为类似Java SE Development 8uN,其中N是JDK更新版本号。
在Java SE Development Kit 7u40之后,7uN中的N是表示JDK是发布以来第N个修正版,但是Oracle改变了这个规则,详情可参考(Java SE Change in Version Numbering Scheme)以下网址:
http://www.oracle.com/technetwork/java/javase/overview/jdk-version-number-scheme-1918258.html
在下载页面还要注意到一个问题,就是最前面有个单选的按钮,你要选择Accept License Agreement单选按钮,接着选择对应操作系统版本的JDK。以Windows x64为例,单击jdk-8u11-windows-x64.exe就可以进行下载。
安装建议选择全部安装吧。
具体配置第2章讲。
1.2.4 认识JDK安装内容
那么你到底安装了哪些东西呢?
Public JRE是给Java程序执行的平台,JDK本身也附带JRE,位于JDK安装的文件夹的jre文件夹下,通常称为Private JRE。
Private JRE和Public JRE其实内容是相同的,只是安装Public JRE或自行下载JRE安装时会注册Java Plugin、Web Start等浏览器或桌面客户端必要的组件,方便需要JRE的桌面应用程序使用。
在JDK的安装目录下还可以看bin文件夹,它里面存放的就是Development Tools选择,各种工具程序如javac,java等都在这个文件夹里。jre文件夹就是Private JRE存放的位置,它是开发Java程序时测试之用。另外有2个压缩包:src.zip与javafx-src.zip,它们是Java SE API的源代码。里面存放着所有.java的文件。
.class文件存放在jre文件夹里的lib文件夹中。其中有个rt.jar的文件。JAR(Java Archive,默然说话:我通常读作“驾儿包”)文件是zip格式的,可直接使用解压软件打开,里面就会看到很多编译好的.class文档。
1.3 重点复习
Java根据应用领域不同,区分为JavaSE、JavaEE与JavaME三大平台。Java SE是各应用平台的基础,分为四个主要的部分:JVM、JRE、JDK与Java语言。JDK包括Java语言和JRE与开发工具,JRE包括Java SE API与JVM。
JCP是个开放性国际组织,目的是让Java演进由Sun非正式地主导,成为全世界数以百计代表成员公开监督的过程。任何想要提议加入Java的功能或特性,必须以JSR正式文件的方式提交,JSR必须经过JCP执行委员会投票通过,方可成为最终标准文件,有兴趣的广商或组织可以根据JSR实现产品。
若JSR成为最终文件后,必须根据JSR成果做出免费且开放源代码的参考实现,称为RI(Reference Implementation),并提供TCK(Technology Compatibility Kit)作为技术兼容性测试工具箱,方便其他根据JSR实现产品的厂商或组织参考与测试兼容性。
只有通过TCK测试的实现,才可以使用Java商标。
从JDK7b10开始有了OpenJDK,Oracle指定了OpenJDK7为官方参考实现。
OpenJDK6并不是SunJDK6的分支,而是将OpenJDK7中JDK7的特性删掉,使之符合JDK6的规范,因而OpenJDK6实际上是OpenJDK7的分支。
对Java程序而言,JVM就是Java的唯一一种操作系统,字节码(Btye Code)文件就是JVM的可执行文件。
JDK本身附有一个JRE,相对于Public JRE这个名称,JDK自己的JRE通常称为Private JRE,只要安装JDK,一定就有Private JRE。安装Public JRE或自行下载JRE安装,会注册Java Plugin、Web Start等浏览器或桌面客户端必要的组件,方便需要JRE的桌面应用程序使用。