您的位置:首页 > 编程语言 > Java开发

J2SE学习笔记1 — Java语言的特性和发展历史

2011-04-14 17:55 411 查看
 
本章重点:
l  Java历史 
l  Java的特点 
l  Java的白皮书 
l  JDK版本演变 
“如果说我比别人看得更远些,那是因为我站在了巨人的肩上。”——牛顿  

1.1  Java语言诞生和发展背景
两大应用对Java的诞生、发展和特性的形成起到了至关重要的作用:
Ø  嵌入式消费设备上的编程需求(设计Java语言的初衷);
Ø  Internet和万维网的发展和应用;
前者对Java语言的特点和Java平台的架构起到了直接作用,后者对Java的发展(J2SE和J2EE)和类库的发展起到了关键作用。
 
1.1.1  设计Java语言的初衷
1991年,Sun公司的Patrick Naughton和James Gosling(一个全能的计算机奇才)带领一个工程师小组,希望设计一种用于像有线电视转换盒这类(嵌入式)消费设备上的计算机语言,这类设备的特点导致在设计程序语言时对JAVA提出了以下主要需求:
Ø  由于这类设备的处理能力和内存都很有限,因此要求设计的语言必须短小精悍,以减少CPU对指令的翻译过程和内存的消耗。
Ø  同时,由于这类设备的厂商会选择不同的cpu,因此语言设计的关键是不能与任何特定的结构捆绑在一起,换言之其设计的语言要求体系结构中立和可移植性好。
在此之前,Pascal曾尝试过这类体系结构中立的模型,利用中间代码在虚拟机上解释执行来解决这个课题的主要问题,SUN的工程师小组充分借鉴了这类模型,并逐渐形成了JAVA现在的JVM机制。
   当然设计一种全新的程序设计语言并不是能够凭空想象出来的,任何一种程序语言的诞生都充分吸取了以前程序语言设计的经验和教训,并根据应用的侧重点扬长避短。由于SUN的工程大多具有UNIX和C++技术的背景,因此自然地以“C/C++”语言为蓝本,创造性地简化了C++语言,并剔除了很多不太实用的功能,形成了一种全新的程序设计语言。
 
1.1.2 Internet的快速发展给Java开辟了一块崭新的天地
   1994年,随着Internet的www日渐壮大,java的开发者决定开发浏览器,最后将其浏览器命名为hotjava,hotjava浏览器就是采用java编写的。同时基于B/S模式的万维网应用给JAVA的发展开辟了一块新的天地,B/S模式的应用处理主要集中在后端服务器的处理,为了能够快速开发出具有强大功能的后端服务器处理软件,java语言的设计者陆续推出J2SE和J2EE两种版本,并不断扩充其类库,使java成为一种能够便捷、功能强大的程序设计语言,同时便于快速部署。同时Internet的发展对JAVA的网络功能、安全性、动态性、多线程等方面提出了需求。
 
1.2  Java的特性
Java并不只是一种程序语言,而是一个完整的平台,有一个庞大的库,其中包含了很多可重用的代码和一个提供诸如安全性、跨操作系统的可移植性以及自动垃圾收集等服务的执行环境。这是Java之所以受到广泛的欢迎的主要原因。
注:关于java的特性,java设计者们编写了“java白皮书”,用来解释设计的初衷以及完成的情况,并发布了一个简单的摘要,这个摘要用下面11个关键术语进行组织:简单性、可移植性、面向对象、解释型、网络功能、高性能、健壮性、安全性、多线程、动态性、体系结构中立。java白皮书可在http://java.sun.com/docs/white/langenv/上找到。
 
1.2.1  java是面向对象的程序设计语言
 
描述项目
面向过程
面向对象
思想方法
分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候进行函数调用即可。
把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个事物在整个解决问题的步骤中的行为。
解题出发点
以实现过程的步骤来划分问题
以功能来划分问题,而不是步骤。
示例:五子棋
面向过程的设计思路就是首先分析问题的步骤:
1、开始游戏;2、黑子先走;3、绘制画面;4、判断输赢;5、轮到白子;6、绘制画面;7、判断输赢;8、返回步骤2;9、输出最后结果。
把上面每个步骤用分别的函数来实现,问题就解决了。
面向对象的设计则从另外的思路来解决问题。整个五子棋可以分为:
1、黑白双方,这两方的行为是一模一样的;
2、棋盘系统,负责绘制画面;
3、规则系统,负责判定诸如犯规、输赢等。
三大类对象,问题的解决在于处理对象间的关系:
第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化;棋盘对象接收到了棋子的变化,就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。
优劣比较
数据和行为是分散的,程序的耦合度紧,不易扩展和移植。例如在五子棋示例中,想加入悔棋的功能,那么从输入到判断到显示这一连串的步骤都要改动,甚至步骤之间的循序都要进行大规模调整。
数据和行为被封装到对象中,程序的耦合度松,易扩展和移植。同样在五子棋示例中加入悔棋功能,只用改动棋盘对象就行了,棋盘系统保存了黑白双方的棋谱,简单回溯就可以了。而显示和规则判断并没有变化,对象功能的调用顺序也没有变化,因此不用顾及,这时改动只是局部的。
 
当然,并不是说用java编写的程序就一定是面向对象的程序,初学者或者蹩脚的程序员很可能以面向对象之虚而行面向过程之实,这样设计出来的程序很难有良好的可移植性和可扩展性。
java面向对象特性与C++旗鼓相当,主要不同点在于多继承,在Java中,取而代之的是简单的接口概念,以及Java的元类(metaclass)模型。
 
1.2.2  Java的简单性和健壮性
(1)简单性
上面说过,SUN的工程师往往具有UNIX和C++的技术背景,因此在开始设计Java语言时自然想到以“C++”为蓝本。而Java最初设计是为嵌入式设备定制的一种语言,自然要求语言具有简单性的特点,同时由于深知C++的缺陷,因此java在设计时尽量接近C++,但剔除了C++中许多很少使用、难以理解、易混淆的特性。可以说,Java语法是C++语法的一个“纯净”版本,但这里没有头文件、指针运算(甚至指针语法)、结构、联合、操作符重载、虚基类等。
同时简单性体现在另一个方面是小。由于是在嵌入式设备上运行,这就要求java的解释器和类库要尽量小,同时指令和语法的简单性可减少对系统性能的损耗。
当然,由于不断的扩展,现在的类库已经相当庞大了,现在有一个独立的具有较小类库的Java微型版(J2ME)用于嵌入式设备。
 (2)健壮性
  用过C和C++的程序员都知道, C程序员是利用指针存取字符串、数组、对象甚至文件(在VB中是没有显式指针的),这必然涉及到内存分配的问题,而在没有指针的语言中,许多数据结构又很难实现。虽然C/C++的指针类型为语言提供了最大的灵活性,但同时也把保护内存的责任赋予了程序员,由此造成的重写内存、损坏数据、运行时段错误和内存溢出等bug层出不穷,可以说C/C++的指针是一把双刃剑。
正是这样的原因,Java在设计时采用了改进的指针模型,该模型具有两方面的优势,它不需要使用指针构造字符串、数组这样的结构,但是必要的话,它也能够具有指针的能力,如链表。java安全的原因是永远不会存取一个“坏的”指针,造成内存分配的错误,也就不必防范内存的泄漏,另外java用引用类型来代替指针,并且不进行直接移动指针的运算。
总之,java和C++最大的不同在于java采用的指针模型可以消除重写内存和损坏数据的可能性,并且java投入了大量的精力进行早期的问题检测、后期动态的(运行时)检测,并消除了有出错倾向的状态。
 
1.2.3 Java平台的中立性
Java最大的特色和优势在于体系结构的中立,因此具有极佳的可移植性,同时也为Java提供了一个安全机制的框架。
(1)JVM的工作机理
Java是一种平台技术,它由四方面组成: Java编程语言、Java类文件格式(字节码)、Java虚拟机和Java应用程序接口(Java API)。它们的关系如下图所示:
 


JVM流程
图右侧Java平台运行期环境代表着Java平台,开发人员编写Java代码(.java文件),然后将之编译成字节码(.class文件)。最后字节码被装入java虚拟机,一旦字节码进入虚拟机,它就会被解释器解释执行,或者是被即时代码发生器有选择的转换成机器码执行。从上图也可以看出Java平台由Java虚拟机和 Java应用程序接口构成的。这个平台的结构如下图所示:



 
在Java平台的结构中, 可以看出,Java虚拟机(JVM) 处在核心的位置,是程序与底层操作系统和硬件无关的关键。
在JVM的下方是移植接口,移植接口由两部分组成:适配器和Java操作系统, 其中依赖于平台的部分称为适配器;JVM 通过移植接口在具体的平台和操作系统上实现;
在JVM 的上方是Java的基本类库和扩展类库以及它们的API, 利用Java API编写的应用程序(application) 和小程序(Java applet) 可以在任何Java平台上运行而无需考虑底层平台, 就是因为有Java虚拟机(JVM)实现了程序与操作系统的分离,从而实现了Java 的平台无关性。
(2)JVM的主要优点
便于移植:由于Java代码是运行在JVM上的,而JVM与平台(底层操作系统和硬件)无关,因而代码易于移植到不同类型的机器上运行;
健壮性和安全性:由于JVM承担了内存管理的职责,程序员不必再担心内存分配的问题,同时JVM进行字节码的检查和运行期间异常和错误处理,因此提高了程序的健壮性;
(3)JVM的主要缺点
由于中间代码字节码(.class)文件在JVM上是解释执行,速度上肯定会比全速地运行机器指令慢很多,因此Java也具有解释型语言的特点。不过Java虚拟机也提供了一个选项,可以将使用最频繁的字节码序列翻译成机器码,从而提高程序运行性能,这一过程被称为即时编译。这一策略已经证明非常有效,致使微软的.NET平台也依赖于虚拟机。
 
1.2.4 Java的可移植性
    除了上述平台无关性利用Java在不同平台上的移植,从Java的语言特点上说,和C与C++不同,java的基本数据类型的大小以及有关算法都有明确的说明,例如java中的int永远为32位的整数,而c/c++中,int可能是16位或32位,并与编译器有关。
    java的数据类型具有固定的大小,这消除了代码移植时令人头痛的主要问题。二进制数据以固定的格式进行的存储和传输,消除了字节顺序的困扰。而字符串采用标准的unicode格式存储。
作为系统组成部分的类库,也定义了可移植的接口,例如有一个抽象的window类给出了在unix、windows和macintosh环境下的不同实现。目前java的用户界面工具箱已经完全重写了,不再依赖于主机的用户接口,比早期版本更加稳定,更加吸引人。
 
1.2.5 Java对服务器端开发的支持
   Java是伴随互联网发展起来的,其对网络编程和数据库开发的支持非常好。由于java要适用于网络/分布式环境,因此对安全性、多线程和动态性的需求都很高。
(1)网络编程
java有一个扩展的例程库,用于处理象HTTP和FTP这类的TCP/IP协议。java应用程序能够通过URL打开和访问网络上的对象,其便捷程度好像访问本地文件一样。同时,远程方法调用机制使得分布式对象之间也可以进行通信。
 (2)安全性
从一开始,java就设计成能够防范攻击的手段,其中包括:
n  运行时堆栈溢出,如蠕虫病毒常用的攻击手段
n  在自己的处理空间之外破坏内存
n  未经授权读写文件
n  许多安全特性相继加入到java中,例如数字签名类(digitally signed class)
使用java可以构建防病毒、防篡改的系统,并提供了供人们使用的规范,实现了虚拟机和安全库
 (3)多线程
  多线程的好处在于交互响应和实时行为。java把多线程的实现交给了底层的操作系统或线程库来完成,其多线程编译的简单性是java成为服务器端开发语言的主要原因之一。
(4)java Applet
    这里的想法很简单:用户从Internet下载java字节码,并在自己的机器上运行。在网页中运行java程序成为applet。而且java虚拟机的安全机制,让我们不必担心来自恶意代码的袭击。
   当今在浏览器中显示动态效果多使用javascript或falsh,而不是applet,其中一个原因是不同版本的Netscape与inernet上运行不同版本的java,这种情况难于利用java的最新版本开发applet。
   另外,java已经成为用来开发服务器端应用程序的流行语言,使用这些服务器端应用程序可以产生网页、运行后端逻辑。
1.3  JDK版本的演变
 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息