第一章Java程序设计概述
目录
一.Java的相关特性
1.简单性
Java语法是C++语法的一个“纯净”版本。这里没有头文件、指针计算(甚至指针语法)、结构、联合、操作符重载、虚基类等。另一方面是小,Java的目标之一是支持开发能够在小型机器上独立运行的软件。
2.面向对象
简单的讲,面向对象设计是一种程序设计技术。它将重点放在数据(即对象)和对象的接口上。Java的面向对象特性与C++起鼓相当。Java与C++的主要不同点在于多继承,在Java中,取而代之的是更简单的接口概念。与C++相比,Java提供了更丰富的运行时自省功能。
3.分布式
Java有一个丰富的例程库,用于处理像HTTP和FTP之类的TCP/IP协议。Java应用程序能够通过URL打开和访问网络上的对象,其便捷程度就好像访问本地文件一样。
4.健壮性
Java的设计目标之一在于使得Java编写的程序具有多方面的可靠性。Java投入了大量的精力进行早期的问题检测、后期动态的(运行时)检测,并消除了容易出错的情况......Java和C++最大的不同在于Java采用的指针模型可以消除重写内存和损坏数据的可能性。
5.安全性
Java适用于网络/分布式环境。为了达到这个目标,在安全方面投入了很大精力。使用Java可以构建防病毒、防篡改的系统。
从一开始,Java就设计成能够防范各种攻击,其中包括:
运行时堆栈溢出。如蠕虫和病毒常用的攻击手段。
破坏自己的进场空间之外的内存。
未经授权读写文件。
6.体系结构中立
编译器生成一个体系结构中立的目标文件格式, 这是一种编译过的代码 , 只要有Java 运行时系统 , 这些编译后的代码可以在许多处理器上运行。 Java 编译器通过生成与特定的计算机体系结构无关的字节码指令来实现这一特性 。 精心设计的字节码不仅可以很容易地在任何机器上解释执行, 而且还可以动态地翻译成本地机器代码。
7.可移植性
在Java中,数据类型具有固定的大小,这消除了代码移植时令人头疼d额主要问题。二进制数据以固定的格式进行存储和传输,消除了字节顺序的困扰。字符串是用标准的Unicode格式存储的。
8.解释型
Java解释器可以在任何移植了解释器的机器上执行Java字节码。由于链接是一个增量式且轻量级的过程,所以,开发过程也变得更加快捷,更加具有探索性。
9.高性能
尽管对解释后的字节码性能已经比较满意,但在有些场合下还需要更加高效的性能。字节码可以(在运行时刻)动态的翻译成对应运行这个应用的特定CPU机器码。
在某些情况下,即时编译器甚至超越了传统编译器,原因是它们含有更多的可用信息。例如,即时编译器可以监控经常执行哪些代码并优化这些代码以提高速度。更为复杂的优化是消除函数调用(即“内联”)。即时编译器知道哪些类已经加载。基于当前加载的类集,如果特定的函数不会被覆盖,就可以使用内联。必要时,还可以撤销优化。
10.多线程
多线程可以带来更好的交互响应和实时行为。
11.动态性
从各种角度看,Java与C或C++相比更加具有动态性。它能够适应不断发展得环境。库中可以自由地添加新方法和实例变量,而对客户端却没有任何影响。在Java中找出运行时类型信息十分简单。
二.Java applet与Internet
在网页中运行的Java程序称为applet。要使用applet,需要启用Java的Web浏览器执行字节码。不需要安装任何软件。任何时候只要访问包含applet的网页都会得到程序的最新版本。
在网页中插入一个applet就如同在网页中嵌入一幅图片。applet会成为页面的一部分。文本环绕着applet所占据的空间周围。关键的一点是这个图片是活动的。它可以对用户命令做出响应,改变外观,在运行它的计算机与提供它的计算机之间传递数据。
如今,要在浏览器中使用applet,这不仅需要一定的水平,而且要付出努力。例如,如果访问Jmol网站,可能会看到一个信息,警告你要适当地配置浏览器运行applet。
三.Java发展简史
Java的历史要追溯到1991年,由Patrick Naughton和James Gosling(一个全能的计算机奇才)带领的Sun公司的工程师小组想要设计一种小型的计算机语言,主要用于像有线电视转换盒这类的消费设备。由于这些消费设备的处理能力和内存都很有限 ,所以语言必须非常小且能够生成非常紧凑的代码 。另外 ,由于不同的厂商会选择不同的中央处理器 ( CPU ) ,因此这种语言的关键是不与任何特定的体系结构捆绑在一起。这个项目被命名为“Green”。
代码短小、紧凑且与平台无关,这些要求促使开发团队设计一个可移植的语言,可以为虚拟机生成中间代码。
不过,Sun公司的人都有UNIX的应用背景。因此,所开发的语言以C++为基础,而不是Lisp、Smalltalk或者Pascal。不过,就像Gosling在专访中谈到的:“毕竟,语言只是实现目标的工具,而不是目标本身”。Gosling把这种语言称为“Oak”。Sun公司的人后来发现Oak是一种已有的计算机语言的名字,于是,将其改名为Java。
1992年,Green项目发布了它的第一个产品,称之为“*7”。这个产品具有非常智能的远程控制。遗憾的是,Sun公司对生产这个产品并不感兴趣,Green项目组的人员必须找出其他的方法来将他们的技术推向市场。然而,没有一个标准消费品电子公司对此感兴趣。于是,Green项目组竞标了一个提供视频点播等新型服务的有线电视盒的项目,但没有成功。
Green项目(这时换了一个新名字——“First Person公司”)花费了1993年一整年以及1994年的上半年,一直在苦苦寻求其技术的买家,然而,一个也没有找到。1994年First Person公司解散了。
当这一切在Sun公司发生的时候,Internet的万维网也在日渐发展壮大。万维网的关键是把超文本页面转换到屏幕上的浏览器。1994年大多数人都在使用Mosaic,这是一个1993年出自伊利诺斯大学超级计算机中心的非商业化的Web浏览器。
在接受SunWorld采访的时候,Gosling说在1994年中期,Java语言的开发者意识到:“我们能够建立一个相当酷的浏览器。我们已经拥有在客户机/服务器主流模型中所需要的体系结构中立、实时、可靠、安全——这些在工作环境中并不太重要,所以,我们决定开发浏览器”。
实际的浏览器是由Patrick Naughton 和 Jonathan Payne开发的,并演变为HotJava浏览器。为了炫耀Java语言超强的能力,HotJava浏览器采用Java编写。设计者让HotJava浏览器具有在网页中执行内嵌代码的能力。这一“技术印证”在1995年5月23日的SunWorld上得到展示,同时引发了人们延续至今的对Java的狂热追逐。
1996年年初,Sun发布了Java的第一个版本。人们很快意识到Java1.0不能用来进行真正的应用开发。的确,可以使用Java1.0来实现画布上随机跳动的神经质的文本applet,但它却没有提供打印功能。坦率的说,Java1.0的确没有为其黄金时期的到来做好准备。后来的Java1.1弥补了其中的大多明显的缺陷,大大改进了反射能力,并未GUI编程增加了新的事件处理模型。不过它任然具有很大的局限性。
1998年JavaOne会议的头号新闻是即将发布Java1.2版。这个版本取代了早期玩具式的GUI,并且它的图形工具箱更加精细而具有可伸缩性,更加接近“一次编写,随处运行”的承诺。在1998年12月Java1.2发布三天之后,Sun公司市场部将其名称改为更加吸引人的“Java2标准版软件开发工具箱1.2版”。
除了“标准版”之外,Sun还推出了两个其他的版本:一个是用于手机等嵌入式设备的“微型版”;另一个是用于服务器端处理的“企业版”。
标准版的1.3和1.4版本对最初的Java2版本做出了某些改进,扩展了标准类库,提高系统性能。当然,还修正了一些bug。在此期间,Java applet采用低调姿态,并淡化了客户端的应用,但Java却成为服务器端应用的首选平台。
5.0版是自1.1版以来第一个对Java语言做出重大改进的版本。经历了多年的研究,这个版本添加了泛型类型,其挑战性在于添加这一特性并没有对虚拟机做出任何修改。另外,还有几个受C#启发的很有用的语言特性:“for each”循环、自动装箱和注解。
版本6于2006年年末发布。同样,这个版本没有对语言方面在进行改进。但是,改进了其他性能,并增强了类库。
随着数据中心越来越依赖于商业硬件而不是专用服务器,Sun Mic'ros'y'stems终于沦陷,于2009年被Oracle收购。Java的开发停滞了很长一段时间。直到2011年Oracle发布了Java版本的一个新版本,Java7,其中只做了一些简单的改进。
2014年,Java8终于发布,在近20年中这个版本有了最大的改变。Java8提供了一种“函数式”编程方式,可以很容易的表述并发执行的计算。所有编程语言都必须与时俱进,Java在这方面显示出非凡的能力。
下表展示了Java语言以及类库的发展状况。可以看到,应用程序编程接口(API)的规模发生了惊人的变化。
四.关于Java的常见误解
1.Java是HTML的扩展
Java是一种程序设计语言;HTML是一种描述网页结构的方式。除了用于在网页上放置Java applet的HTML扩展之外,两者没有任何共同之处。
2.使用XML,所以不需要Java
Java是一种程序设计语言;XML是一种描述数据的方式。可以使用任何一种程序设计语言处理XML数据,而Java API对XML处理提供了很好的支持。此外,许多重要的第三方XML工具采用Java编写。
3.Java是一种非常容易学习的程序设计语言
像Java这种功能强大的语言大都不太容易学习。首先,必须将编写玩具式程序的轻松和开发实际项目的艰难区分开来。
4.Java将成为使用于所有平台的通用性编程语言
从理论上讲,这是完全有可能的。但在实际中,某些领域其他语言有更出色的表现,比如,Objective C和后来的SWift在iOS设备上就有着无可取代的地位。浏览器中的处理几乎完全由JavaScript掌控。Windows程序通常都用C++或C#编写。Java在服务器端编程和跨平台客户端应用领域很有优势。
5.Java只不过是另外一种程序设计语言
Java是一种很好的程序设计语言,很多程序设计人员喜欢Java胜过C、C++或C#。有上百种好的程序设计语言没有广泛地流行,而带有明显缺陷的语言,如:C++和Visual Basic却大行其道。
这是为什么呢?程序设计语言的成功更多的取决于其支撑系统的能力,而不是优美的语法。人们主要关注 :是否提供了易于实现某些功能的易用、便捷和标准的库?是否有开发工具提供商能建立强大的编程和调试环境?语言和工具集是否能够与其他计算机基础架构整合在一起?Java的成功源于其类库能够让人们轻松的完成原本有一定难度的事情。例如:联网Web应用和并发。Java减少了指针错误,这是一个额外的好处,因此使用Java编程的效率更高。但这些并不是Java成功的全部原因。
6.Java是专用的,应该避免使用
最初创建Java时,Sun为销售者和最终用户提供了免费许可。尽管Sun对Java拥有最终的控制权,不过在语言版本的不断发展和新库的设计过程中还涉及很多其他公司。虚拟机和类库的源代码可以免费获得,不过仅限于查看,而不能修改和再发布。Java是“闭源的,不过可以很好地使用”。
这种情况在2007年发生了喜剧性的变化,Sun声称Java未来的版本将在General Public License(GPL)下提供。Linux使用的是同一个开放源代码许可。Oracle一直致力于保持Java开源。只有一点美中不足——专利。根据GPL,任何人都可以得到专利许可,允许其使用和修改Java,不过仅限于桌面和服务器平台。如果你想在嵌入式系统中使用Java,就需要另外一个不同的许可,这很可能需要付费。不过,这些专利在未来十年就会到期,那时Java就完全免费了。
7.Java是解释型的,因此对于关键的应用程序速度太慢了。
早期的Java是解释型的。现在Java虚拟机使用了即时编译器,因此采用Java编写的“热点”代码其运行速度与C++相差无几,有些情况甚至更快。
对于Java桌面应用速度慢,人们已经抱怨很多年了。但是,今天的计算机速度远比人们发出抱怨的时候快了很多。一个较慢的Java程序与几年前相当快的C++程序相比还要快一些。
8.所有的Java程序都是在网页中运行的
所有的Java applet都是在网页浏览器中运行的。这也恰恰是applet的定义,即一种在浏览器中运行的Java程序。然而,大多数Java程序是运行在Web浏览器之外的独立应用程序。实际上,很多Java程序都在Web服务器上运行并生成用于网页的代码。
9.JavaScript是Java的简易版
JavaScript是一种在网页中使用的脚本语言,它是由Netscape发明的,原来的名字叫做LiveScript。JavaScript的语法类似Java,除此之外,两者无任何关系。