面向对象的程序设计-Java张白一第三版第1章.ppt

上传人:小飞机 文档编号:6034393 上传时间:2023-09-16 格式:PPT 页数:105 大小:1.65MB
返回 下载 相关 举报
面向对象的程序设计-Java张白一第三版第1章.ppt_第1页
第1页 / 共105页
面向对象的程序设计-Java张白一第三版第1章.ppt_第2页
第2页 / 共105页
面向对象的程序设计-Java张白一第三版第1章.ppt_第3页
第3页 / 共105页
面向对象的程序设计-Java张白一第三版第1章.ppt_第4页
第4页 / 共105页
面向对象的程序设计-Java张白一第三版第1章.ppt_第5页
第5页 / 共105页
点击查看更多>>
资源描述

《面向对象的程序设计-Java张白一第三版第1章.ppt》由会员分享,可在线阅读,更多相关《面向对象的程序设计-Java张白一第三版第1章.ppt(105页珍藏版)》请在三一办公上搜索。

1、第1章 Java系统环境概述,1.1 编程语言的发展 1.2 网络时代的编程语言Java 1.3 Java的开发运行环境 1.4 Java程序的运行步骤,1.1 编程语言的发展自从1946年第一台电子计算机问世以来,人们一直在探索着自然语言与计算机语言之间的映射问题。我们知道,人类的任何思维活动都是借助于人们所熟悉的某种自然语言进行的。若希望借助计算机完成人类的一种思维活动,就需要把用自然语言表达的东西转换成计算机能够理解和执行的语言形式,这便是编程语言或程序设计语言。毫无疑问,电子计算机毕竟是一种机器,它能够理解和执行的编程语言和自然语言之间存在着较大的差距,这种差距被人们称做“语言的鸿沟”

2、。这一鸿沟虽不可彻底消除,但可以使其逐渐变窄。,事实上,从计算机问世至今,各种编程语言的发展变迁,其目的就是为了缩小这一鸿沟。图1.1引自参考文献3,笔者稍作修改,该图展示了从机器语言发展到面向对象的语言使“语言的鸿沟”变窄的情形。,图1.1 编程语言的发展与“语言的鸿沟”的变化,1.1.1 机器语言电子计算机是一种机器,这种机器主要由电子元器件构成。对于电子元器件来说,最容易表达的是电流的通/断或电位的高/低两种状态。因此,在电子计算机问世之初,人们首先想到的是用“0”和“1”两种符号来代表电路的通和断两种状态,这便是最早的编程语言机器语言。,机器语言是计算机能够理解并直接执行的唯一语言,整

3、个语言只包含“0”和“1”两种符号。用机器语言编写的程序,无论是它的指令、数据还是其存储地址,都是由二进制的“0”和“1”组成的。这种语言离计算机最近,机器能够直接执行它。然而,由“0”和“1”组成的二进制串没有丝毫的形象意义,因此,它离人类的思维最远,“语言的鸿沟”最宽。所以,用机器语言编写程序的效率最低,并且在编写程序时很容易发生错误。,1.1.2 汇编语言为了克服机器语言的缺陷,人们设想用一些易于理解和记忆的符号来代替二进制码,这便是汇编语言。由于汇编语言用符号构成程序,而这些符号表示指令、数据、寄存器、地址等物理概念,因而,使用汇编语言编程在适合人类形象思维的道路上前进了一步。但是,使

4、用汇编语言编写程序时,编程人员依然需要考虑寄存器等大量的机器细节,即汇编语言仍然是一种与具体机器硬件有关的语言,是一种面向机器的语言,因此,人们也把它称为符号化的机器语言。,1.1.3 高级语言由于机器语言和汇编语言都离不开具体的机器指令系统,用它们编程时要求程序员必须熟悉所用计算机的硬件特性,因而,用它们编写程序的技术复杂、效率不高,且可维护性和可移植性都很差。为了从根本上摆脱语言对机器的依附,人们经过多年的潜心研究,终于在1956年推出了一种与具体机器指令系统无关、表达方式接近自然语言的计算机语言FORTRAN语言。在FORTRAN语言程序中,采用了具有一定涵义的数据命名和人们容易理解的执

5、行语句,屏蔽了机器细节,使得人们在书写和阅读程序时可以联系到程序所描述的具体事物。所以,人们把这种“与具体机器指令,系统无关,表达方式接近自然语言”的计算机语言称为高级语言。高级语言的出现是编程语言发展史上的一大进步,它缩小了编程语言与自然语言之间的鸿沟。此后,高级语言进一步向体现客观事物的结构和逻辑涵义的方向发展。结构化数据、结构化语句、数据抽象、过程抽象等概念相继被提出。以1971年推出的Pascal为典型代表的结构化程序设计语言,进一步缩小了编程语言和自然语言的距离。在此后的十几年中,结构化程序设计进一步发展成为一门方法学。在20世纪70年代到80年代,各种结构化程序设计语言及方法非常流

6、行,成为当时软件开发设计领域的主流技术。,在结构化程序设计中,把程序概括为如下的公式:程序=数据结构+算法其中,数据结构是指利用计算机的离散逻辑来量化表达需要解决的问题,而算法则研究如何高效、快捷地组织解决问题的具体过程。可见,以结构化程序设计为代表的高级语言是一种面向数据/过程的程序设计语言,人们把这类语言也称为面向过程的语言。,面向过程的语言可以精确地用计算机所理解的逻辑来描述和表达待解决问题的具体解决过程。然而,它把数据和过程分离为相互独立的实体,使程序中的数据和操作不能有效地组织成与问题域中的具体事物相对应的程序成分,所以它很难把一个具有多种相互关系的复杂事物表述清楚。程序员在编写算法

7、时,必须时刻考虑所要处理问题的数据结构,如果数据结构发生了轻微的变化,那么对处理这些数据的算法也要做出相应的修改,甚至完全重写,否则这个算法就不可再用。因而,用这种程序设计方法编写的软件,其重用性较差。为了较好地解决软件的重用性问题,使数据与程序始终保持相容,人们又提出了面向对象的程序设计方法。,1.1.4 面向对象的语言面向对象的编程语言(Object-Oriented Programming Language,OOPL)的设计出发点是为了能更直接地描述问题域中客观存在的事物(即对象)以及它们之间的关系。面向对象技术追求的是软件系统对现实世界的直接模拟,是将现实世界中的事物直接映射到软件系统

8、的解空间。它希望用户最大程度地利用软件系统,花费少量的编程时间来解决需要解决的问题。在面向对象的程序设计语言中,可以把程序描述为如下的公式:程序=对象+消息,面向对象的语言对现实世界的直接模拟体现在下面几个方面:(1)对象(object)。只要我们仔细研究程序设计所面对的问题域客观世界,就可以看到,客观世界是由一些具体的事物构成的,每个事物都具有自己的一组静态特征(属性)和一组动态特征(行为)。例如,一辆汽车有颜色、型号、马力、生产厂家等静态特征,又具有行驶、转弯、停车等动态特征。要把客观世界的这一事实映射到面向对象的程序设计语言中,则需把问题域中的事物抽象成对象,用一组数据描述该对象的静态特

9、征(即属性,在Java中称之为数据成员),用一组方法来刻画该对象的动态特征(即行为)。,(2)类(class)。客观世界中的事物既具有特殊性又具有共同性。人类认识客观世界的基本方法之一就是对事物进行分类,即根据事物的共同性把事物归结为某些类。考虑一下所有的汽车和一辆汽车之间的关系就很容易理解这一点。OOPL很自然地用类(class)来表示一组具有相同属性和方法的对象。(3)继承(inheritance)。在同一类事物中,每个事物既具有同类的共同性,又具有自己的特殊性。OOPL用父类与子类的概念来描述这一事实。在父类中描述事物的共性,通过父类派生(derive)子类的机制来体现事物的个性。考虑同

10、类事物中每个事物的特殊性时,可由这个父类派生子类,子类可以继承父类的共同性,又具有自己的特殊性。,(4)封装(encapsulation)。客观世界中的事物是一个独立的整体,它的许多内部实现细节是外部所不关心的。例如,对于一个只管开车的驾驶员来说,他可能根本不知道他所驾驶的这辆汽车内部用了多少根螺钉或几米导线,以及它们是怎样组装的。OOPL用封装机制把对象的属性和方法结合为一个整体,并且屏蔽了对象的内部细节。,(5)关联(association)。客观世界中的一个事物可能与其他事物之间存在某种行为上的联系。例如,一辆行驶中的汽车遇到红色信号灯时要刹车停止,OOPL便通过消息连接来表示对象之间的

11、这种动态联系,也称之为关联。(6)组合体(composite)。拥有其他对象的对象被称为组合体。客观世界中较为复杂的事物往往是由其他一些比较简单的事物构成的。例如,一辆自行车是由车架、车轮、把手等构件构成的。OOPL也提供了描述这种组合体的功能。,综上所述,面向对象的编程语言使程序能够比较直接地反映客观世界的本来面目,并且使软件开发人员能够运用人类认识事物所采用的一般思维方法来进行软件开发。面向对象的语言和人类认识、理解客观世界所使用的自然语言之间的差距是比较小的。当然,二者之间仍然存在着一定的差距,自然语言的丰富多样和借助人脑的联想思维才能辨别的语义,仍是目前任何一种计算机编程语言无法相比的

12、。,1.1.5 面向对象语言的发展面向对象的语言是在软件开发的实践中逐步提出并不断得到完善的。1967年由挪威计算中心开发的Simula 67语言首先引入了类的概念和继承机制,被认为是面向对象语言的鼻祖。20世纪70年代出现的CLU、并发Pascal、Ada和Modula-2等编程语言,对抽象数据类型理论的发展起到了重要作用。这些语言支持数据与操作的封装。,1980年提出的Smalltalk-80是第一个完善的、能够实际应用的面向对象语言。它在系统的设计中强调对象概念的统一,并引入和完善了类、方法、实例等概念和术语,应用了继承机制和动态链接。它被认为是一种最纯粹的面向对象的程序设计语言。从20

13、世纪80年代中期到90年代,是面向对象语言走向繁荣的阶段。其主要表现是大批比较实用的OOPL的涌现,例如C+、Objective-C、Object Pascal、COLOS(Common Lisp Object System)、Eiffel、Actor及Java等。,综观所有的面向对象程序设计语言,我们可以把它们分为两大类:(1)纯粹的面向对象语言,如Smalltalk、Java。在这类语言中,几乎所有的语言成分都是“对象”。这类语言强调的是开发快速原型的能力。(2)混合型的面向对象语言,如C+、Object Pascal。这类语言是在传统的过程化语言中加入了各种面向对象的语言机构,它们强调的

14、是运行效率。,1.2 网络时代的编程语言JavaInternet将世界各地成千上万的计算机子网连接成一个庞大的整体,而这些子网是由各种各样不同型号、不同规模、使用不同操作系统、具有不同应用软件平台的计算机组成的。这就很自然地提出了一个问题:有没有一种语言,使得程序员用这种语言编写的程序可以在不同的计算机上运行,从而减少编程工作量,提高程序的可移植性,使Internet能够发挥更多、更大的作用呢?Java正是顺应了这种需求,因而得到了广泛的使用。它以其平台无关性、面向对象、多线程、半编译半解释等特点而成为网络时代的编程语言。,1.2.1 Java的产生1991年初,美国加州的Sun Micros

15、ystem公司(以下简称Sun公司)成立了一个以James Gosling为首、名为Green的项目研发小组,其目标是开发一个面向家用电器市场的软件产品,用软件实现一个对家用电器进行集成控制的小型控制装置。他们首先注意到这个产品必须具有平台独立性,即让该软件在任何CPU上都能运行。为达到此目的,Gosling首先从改写C+语言的编译器着手。但是,他们很快便意识到这个产品还必须具有高度的简洁性和安全性,而C+在这方面显然无法胜任。因此,Gosling决定自行开发一种新的语言,并将该语言命名为Oak(橡树)。,Oak是Green项目小组开发的名为“*7”(StarSeven)产品中的一个组成部分。

16、StarSeven是一个集成了Oak、GreenOS(一种操作系统)、用户接口模块和硬件模块四个部分的类似于PDA(Personal Digital Assistant,个人数字助理)的设备。StarSeven的第一个原型于1992年8月问世。尽管这个原型非常成功,但在竞争激烈的家用电器市场上却败给了竞争对手。失败的原因固然是多方面的,但笔者认为这与Sun公司的主业是计算机产品而不是家用电器产品这一因素密切相关。,“有心栽花花不开,无心插柳柳成荫。”有趣的是,在这段时间里,WWW的发展却如日中天。1993年7月,伊利诺斯大学的NCSA推出了一个在Internet上广为流行的WWW浏览器Mosa

17、ic 1.0版。然而,这时的WWW页面虽然内容丰富,声、图、文并茂,但它却是静态的,若想增强WWW的动感,需要通过一种机制来使它具有动态性。其解决方案显然是嵌入一种既安全可靠,又非常简练的语言。Oak完全能满足这一要求,但是要将它推向市场,为人们所广泛接受,还必须采用一种合适的策略。在这种情况下,1994年,Sun公司的创始人之一Bill Joy的介入,促成Oak成为Java并得以走红。,Bill Joy早年曾参与过UNIX的开发,深知网络对UNIX的推广所起的作用。因此,他不仅指定Gosling继续完善Oak(发布时改名为Java),同时要求Naughton用Oak编写一个真正的应用程序We

18、bRunner,也就是后来被命名为HotJava的WWW浏览器。1994年底,两人均出色地完成了各自的任务。这时,在这个产品的发布问题上,Bill Joy力排众议,采取了“让用户免费使用来占领市场份额”的策略,促成了Java与HotJava于1995年初在Internet上的免费发布。由于Java确实是一种分布式、安全性高、内部包含编译器又非常小的适合网络开发环境的语言,因而一经发布,立即得到包括Netscape在内的各WWW厂商的广泛支持。工业界,一致认为:“Java是(20世纪)80年代以来计算机界的一件大事。”微软总裁Bill Gates认为:“Java是长期以来最卓越的程序设计语言。”

19、而今,Java已成为最流行的网络编程语言。Java名称的由来:由于Oak这个名称与其他产品的名称雷同,因此开发小组后来为这个新语言取了一个新名称Java(爪哇)。据说取这个名称的灵感来自于这样一个故事:研发小组的成员经常在公司附近的一家咖啡厅喝咖啡,而咖啡的原产地是Java,于是就将这一新语言取名为Java。,1.2.2 Java的特点Sun公司在“Java白皮书”中对Java的定义是:“Java:A simple,object-oriented,distributed,interpreted,robust,secure,architecture-neutral,portable,high-p

20、erformance,multi-threaded,and dynamic language.”。按照这个定义,Java是一种具有“简单、面向对象的、分布式、解释型、健壮、安全、与体系结构无关、可移植、高性能、多线程和动态执行”等特性的语言。下面我们简要叙述Java的这些特性。,1.简单性Java语言简单而高效,基本Java系统(包含编译器和解释器)所占空间只有250 KB左右。当然,这与Java的起源有很大关系。前已述及,Java最初是为了对家用电器进行集成控制而设计的一种语言,因此它必须具有简单明了的特性。,我们注意到,Gosling等人在设计Java之初,是从改写C+编译器入手的,这就使

21、Java具有了以下特点:其语言风格类似于C+,保留了C+语言的优点;摈弃了C+中不安全且容易引发程序错误的指针;消除了C+中可能给软件开发、实现和维护带来麻烦的地方,包括其冗余、二义性和存在安全隐患之处,如操作符重载、多重继承和数据类型自动转换等;简化了内存管理和文件管理Java提供了C+中不具备的自动内存垃圾搜集机制,从而减轻了编程人员进行内存管理的负担,有助于减少软件错误。从这些方面看,Java是C+的简化和改进,因而C+程序员可以很快掌握Java编程技术。,Java的简单性是以增加运行时系统的复杂性为代价的。以内存管理为例,自动内存垃圾处理减轻了面向对象编程的负担,但Java运行时系统却

22、必须内嵌一个内存管理模块。虽然如此,对编程人员而言,Java的简单性只会是一个优点,它可以使我们的学习曲线更趋合理化,加快我们的开发进度,减少程序出错的可能性。,2.面向对象Java语言是纯面向对象的,它不像C+那样既支持面向对象的技术,又支持面向过程的程序设计技术(对象及其相关概念请参阅第4章)。这里只从一个侧面说明面向对象的编程语言与面向过程的编程语言之间的区别。传统的面向过程的编程语言把程序概括为程序=数据结构+算法而面向对象的编程语言把程序概括为程序=对象+消息,在面向对象的技术中,可以把现实世界中的任何实体都看做对象。对象其实就是现实世界模型的一个自然延伸。现实世界中的对象均具有属性

23、和行为,映射到计算机程序上,属性用数据表示,行为用程序代码实现。可见,对象实际上就是数据和算法(程序代码)的封装体,它用一个自主式框架把代码和数据结合在一起。面向对象的程序设计技术较传统的面向过程的程序设计技术更能真实地模拟现实世界。,Smalltalk的发明人Alan Kay对第一个成功的面向对象语言Smalltalk总结出的五个基本特征如下(当然,这些特征也是Java语言所具备的):(1)万物皆对象。理论上讲,我们可以抽取待解问题的任何概念化成分,将其表示为程序中的对象。可以将对象视为奇特的变量,它既可以存储数据,也可以执行操作。(2)程序是对象的集合,它们通过发送消息实现调用。消息就是对

24、某个特定对象的方法的调用请求。具体地说,要想请求一个对象,就必须向该对象发送一条消息。,(3)每个对象都有自己的由其他对象所构成的存储。换句话说,可以通过创建包含现有对象的包的方式来创建新的对象。因此,可以在程序中构建复杂的体系,同时将其复杂性隐藏在对象的简单性背后。(4)每个对象都拥有其类型。按照通用的说法,“每个对象都是某个类(class)的一个实例(instance)”,这里的“类”是“类型”的同义词。每个类区别于其他类的最重要特性就是“可以发送什么样的消息给它”。,(5)某个特定类型的所有对象都可以接收同样的消息。例如:因为“圆形”类型的对象同时也是“几何形”类型的对象,所以,一个“圆

25、形”对象必定能够接收发送给“几何形”对象的消息。这也意味着可以编写与“几何形”交互并自动处理所有与“几何形”性质相关的事物的代码。Java语言是纯面向对象的,它的设计集中于对象及其接口,提供了简单的类机制以及动态的接口模型。对象中封装了它的属性和行为,实现了模块化和信息隐藏;而类则提供了一类对象的原型,并且通过继承机制,子类可以使用父类所提供的方法,实现了代码的复用。,3.可移植性(平台无关性)程序的可移植性指的是程序不经修改就能在不同硬件或软件平台上运行的特性,即“一次编写,到处运行”的特性。可移植性在一定程度上决定了程序的可应用性。可移植性分为两个层次:源代码级可移植性和二进制代码级可移植

26、性。C和C+只具有一定程度的源代码级可移植性,其源程序要想在不同平台上运行,必须重新编译。而Java不仅是源代码级可移植的,甚至经过编译之后形成的二进制代码字节码,也同样是可移植的。,Java采用了多种机制来保证可移植性,其中最主要的有两条:第一,Java既是编译型的,又是解释型的。Java语言与传统语言的不同运行机制如图1.2所示。,图1.2 Java语言与传统语言的不同运行机制,图1.2(a)是传统语言的运行机制,其特点是:源程序经过编译生成的目标代码(.obj文件)是为在某个特定的操作系统上运行而产生的,该文件中包含了对应处理机的本机代码,所以,不能移植到其他的操作系统上运行。图1.2(

27、b)是Java语言的运行机制,它的特点是:源程序经过编译生成的字节码代码(class文件)是在Java虚拟机(Java Virtual Machine,JVM)平台上运行的,而不是直接在操作系统平台上运行的。JVM在任何平台上都提供给编译程序一个共同的接口,编译程序只需要面向JVM,生成JVM能够理解的字节码代码,然后由JVM的解释器负责解释执行即可。JVM把Java字节码代码与具体的软/硬件平台分隔开来,保证了字节码的可移植性。关于JVM的更详细叙述请参阅节。,第二,Java采用的是基于国际标准IEEE标准的数据类型。Java的数据类型在任何机器上都是一致的,它不支持特定于具体的硬件环境的数

28、据类型。它还规定同一种数据类型在所有实现中必须占据相同的空间大小(C+的数据类型在不同的硬件环境或操作系统下占据的内存空间是不同的)。通过在数据类型的空间大小方面采用统一标准,Java成功地保证了其程序的平台独立性。,此外,Java的可移植性还体现在Java的运行环境上。Java编译器是用Java语言本身编写的,而其他编程语言运行的环境则是用ANSI C(美国标准C语言)编写的,Java的整个运行环境体现了一个定义良好的可移植性接口。Java语言规范还遵循POSIX(可移植操作系统接口)标准,这也是Java具有良好可移植性的重要原因。,4.高性能一般情况下,可移植性、稳定性和安全性几乎总是以牺

29、牲性能为代价的,解释型语言的执行效率一般也要低于直接执行源码的速度。但Java所采用的措施却很好地弥补了这些性能差距。这些措施包括:(1)高效的字节码。Java字节码格式的设计充分考虑了性能因素,其字节码的格式非常简单,这使得经由Java解释器解释执行后可产生高效的机器码。Java编译器生成的字节码和机器码的执行效率相差无几。据统计,Java字节码的执行效率非常接近于由C和C+生成的机器码的执行效率。,(2)多线程。线程是现代操作系统提出的一个新概念,是比传统的进程更小的一种可并发执行的执行单位。线程的概念提高了程序执行的并发度,从而可提高系统效率。C和C+采用的是单线程的体系结构,均未提供对

30、多线程的语言级支持。与此相反,Java却提供了完全意义的多线程支持。,Java的多线程支持体现在两个方面:首先,Java环境本身就是多线程的,它可以利用系统的空闲时间来执行诸如必要的垃圾清除和一般性的系统维护等操作;其次,Java还提供了对多线程的语言级支持,利用Java的多线程编程接口,编程人员可以很方便地编写出支持多线程的应用程序,提高程序的执行效率。必须注意的是,Java的多线程支持在一定程度上可能会受其运行时支撑平台的限制,并且依赖于其他一些与平台相关的特性。比方说,如果操作系统本身不支持多线程,Java的多线程就可能只是“受限”的或不完全的多线程。,(3)及时编译和嵌入C代码。Jav

31、a的运行环境还提供了另外两种可选的性能提高措施:及时编译和嵌入C代码。及时编译是指在运行时把字节码编译成机器码,这意味着代码仍然是可移植的,但在开始时会有一个编译字节码的延迟过程。嵌入C代码在运行速度方面效果当然是最理想的,但会给编程人员带来额外的负担,同时将降低代码的可移植性。,5分布式分布的概念包括数据分布和操作分布两个方面。数据分布是指数据可以分散存放于网络上不同的主机中,以解决海量数据的存储问题;操作分布则是指把计算分散到不同的主机上进行处理,这就如同由许多人协作共同完成一项大而复杂的工作一样。,Java是面向网络的语言。它拥有广泛的能轻易地处理TCP/IP协议的运行库,例如HTTP与

32、FTP类库等等。这使得在Java中比在C或C+中更容易建立网络连接。对于数据分布,Java应用程序可以利用URL通过网络开启和存取对象,就如同存取一个本地文件系统一样简单。对于操作分布,Java的客户机/服务器模式可以把计算从服务器分散到客户端,从而提高整个系统的执行效率,避免瓶颈制约,增加动态可扩充性。,6动态特性多数面向对象程序设计语言在系统设计和编程阶段都能充分体现OO思想,但却很难将其延伸到系统运行和维护阶段。这主要是因为多数语言都采用静态链接机制。一个系统是由多个模块组成的,若采用静态链接机制,则在编译时就会将系统的各模块和类链接组合成一个整体,即一个目标文件。如果某个类进行了修改,

33、则整个系统就必须重新编译,这对大型分布式系统(例如,交通信息处理系统、金融机构信息处理系统等)的修改、维护或升级是不利的。如何在系统运行阶段动态地进行系统的修改或升级便成为迫切需要解决的问题。,Java采用“滞后联编”机制,即动态链接机制,解决了上述问题。Java的“滞后联编”技术将OO特点延伸到系统的运行阶段。Java程序的基本组成单位是类,若一个系统是由多个类模块组成的,则编译时每个类被分别编译成相应的类文件,即字节码文件。一个字节码系统由若干个字节码文件组成,使得系统的类模块性得以保留。在系统运行时,字节码文件按程序运行的需要而动态装载(也可以通过网络来载入)。因此,如果在一个系统中修改

34、了某一个类,只需要对此类重新编译,而系统中的其他类不必重新编译。这就保证了系统在运行阶段可以动态地进行类或类库的修改或升级。“滞后联编”机制使得Java程序能够适应不断变化的运行环境,使用户能够真正拥有“即插即用”(plug-and-play)的软件模块功能。,此外,Java的动态性还表现在支持动态数据类型和动态协议方面。通过编写协议句柄,Java可以支持新的、自定义的传输协议。编写内容句柄可以支持新的数据类型。,7健壮性和安全性Java设计的目的是用于网络/分布式计算环境。为此,Java提供了一系列安全检查机制,使得Java更具健壮性和安全性。Java的安全检查机制分为多级,主要包括Java

35、语言本身的安全性设计、严格的编译检查、运行检查和网络接口级的安全检查等。,(1)Java语言本身的安全性设计。Java去掉了C+中许多复杂的、冗余的、有二义性的概念,例如操作符重载、多继承、窄化类型转换等,去掉了C+语言中的指针运算、结构体或联合、需要释放内存等功能,而提供了数组下标越界检查机制、异常处理机制、自动内存垃圾收集机制等,使Java语言功能更精练、更健壮。其主要特点说明如下:不支持窄化类型转换。在C+中可以进行窄化类型转换,例如,将一浮点值赋予整型变量,这样有可能面临信息丢失的危险。Java不支持窄化类型转换,如果需要则必须显式地进行类型转换。,不支持指针数据类型。C+程序在安全性

36、方面的最大问题在于指针的使用。使用指针的一个危险是它能够访问任意内存空间,如果病毒利用指针进入操作系统的内存空间,并在其中执行特权指令,它就能随心所欲地进行破坏。Java语言不支持指针数据类型,一切对内存的访问都必须通过对象的实例变量来实现,从而杜绝了内存的非法访问,程序员便不再能够凭借指针在任意内存空间中“遨游”。数组下标越界检查机制。Java提供的数组下标越界检查机制,使网络“黑客”们无法构造出不进行数组下标越界检查的C和C+语言所支持的那种指针。,通过类型检查、Null指针检测、数组边界检测等方法,可以在开发的早期发现程序中的错误。完善的异常处理机制。异常情况可能经常由“被零除”、“数组

37、下标越界”、“文件未找到”等原因引起。如果没有异常处理机制,则必须编写一大堆既繁琐又难理解的指令来进行管理。Java语言中通过提供异常处理机制来解决异常的处理问题,简化了异常处理任务,增强了程序的可读性和系统容错能力。,自动内存垃圾收集机制。C+程序缺乏自动的内存管理机制,在C+中,必须手工分配、释放所有的动态内存。如果忘记释放原来分配的内存,或是释放了其他程序正在使用的内存,就会出错。Java提供垃圾收集器,可自动收集闲置对象占用的内存,防止程序员在管理内存时容易发生的错误。,(2)编译检查。Java编译器对所有的表达式和参数都要进行类型相容性的检查,以确保类型是兼容的。在编译时,Java会

38、指出可能出现但未被处理的例外,帮助程序员正确地进行选择以防止系统的崩溃。另外,Java在编译时还可捕获类型声明中的许多常见错误,防止动态运行时不匹配问题的出现。在编译期间,Java编译器并不分配内存,而是推迟到运行时由解释器决定,这样编程人员就无法通过指针来非法访问内存。,(3)运行检查。在运行期间,Java的运行环境提供了字节码校验器、运行时内存布局、类装载器和文件访问限制四级安全保障机制。字节码校验器(Byte Code Verifier)。当Java字节码进入解释器时,即使Java编译器生成的是完全正确的字节码,解释器也必须再次对其进行检查,这是为了防止正确的字节码在解释执行前可能被改动

39、。,运行时内存布局和类装载器(Class Loader)。Java解释器将决定程序中类的内存布局,这意味着“黑客”们将无法预先得知一个类的内存布局结构,从而也就无法利用该信息来“刺探”或破坏系统。随后,类装载器负责把来自网络的类装载到其单独的内存区域,避免应用程序之间的相互干扰或破坏。文件访问限制。客户机端还可以限制网络上装载的类只能访问某些允许的文件系统。,(4)网络接口级的安全检查。在网络接口级,用户可按自己的需要来设置网络访问权限。上述机制综合在一起,使得Java成了最安全的编程语言和环境之一,并且保证了Java代码无法成为类似特洛伊木马和蠕虫等具有潜在破坏作用病毒的宿主。,1.3 Ja

40、va的开发运行环境目前有许多为快速开发Java程序提供的集成开发环境(IDE),它们将编辑、编译、构造、调试和在线帮助集成在一个用户图形界面中,有效地提高了编程速度。例如Oracle公司的NetBeans、Borland公司的JBuilder、Eclipse联盟的Eclipse等。,NetBeans IDE是开源的软件开发集成环境,是一个开放框架、可扩展的开发平台,可以用于Java、C/C+、PHP等语言的开发,还可以通过扩展插件来扩展功能。它极大地简化了软件的开发过程。因此,本书选用NetBeans IDE作为开发工具。在此环境下开发Java应用程序,需要下载两个软件:JDK 6和NetBe

41、ans IDE。本书就是以Oracle公司提供的Windows环境下的捆绑软件包为开发环境的。,1.3.1 下载和安装JDK与NetBeansJDK(Java Development Kit,Java开发工具)是一个编写Java Applet和应用程序的开发环境。下载JDK 6和NetBeans捆绑软件包(简体中文)的URL为http:/technetwork/java/javase/downloads/jdk-netbeans-jsp-142931.html。在图1.3所示的界面中找到“jdk-6u33-nb-7_1_2-windows-ml.exe”后(图中粗箭头所指项),点击下载,并指明

42、存放位置。本书存放在E:/Java文件夹中。下载完成后,双击图1.4中的“热咖啡”图标(图中粗箭头所指项)进行安装,同样要指明安装位置。本书安装到E:/Java文件夹中。安装完成后,系统会在桌面产生NetBeans运行文件的快捷方式。,图1.3 ORACAL中国的官方网站,图1.4 下载的文件,1.3.2 运行NetBeans IDE双击运行桌面上的NetBeans快捷方式,出现如图1.5所示的界面,表明NetBeans集成开发环境启动成功。,图1.5 启动NetBeans IDE后的界面,1.4 Java程序的运行步骤Java语言是一种半编译半解释型的语言。Java的用户程序分为两类:Jav

43、a Application和Java Applet。这两类程序在程序结构和执行机制上都有一定的差异。Java Application是完整的程序,需要独立的Java解释器来解释运行。Java Applet程序不能单独运行,必须嵌入到用HTML语言编写的Web页面中,通过与Java兼容的浏览器来控制执行。,1.4.1 JVM的体系结构及工作原理一个由Java语言编写的源程序,经过Java编译器编译,生成Java虚拟机上的字节码,再由Java虚拟机上的执行引擎(解释器)执行,并产生执行结果。一个Java语言程序的编译、解释和执行过程如图1.6所示。Java虚拟机(JVM)是可以运行Java字节码的

44、假想计算机,是Java面向网络的核心,支持Java面向网络体系结构三大支柱(平台无关性、安全性和网络移动性)的所有方面。其主要任务是装载.class文件并且执行其中的字节码。JVM的内部体系结构如图1.7所示,主要分为三部分:类装载器子系统、运行时数据区和执行引擎。,图1.6 Java语言程序的编译、解释和执行过程,图1.7 JVM的内部体系结构,(1)类装载器子系统:负责装载所有由用户自己编写生成的.class文件以及这些.class文件引用的JDK API。(2)执行引擎:负责将字节码翻译成适用于本地机系统的机器码,然后再送硬件执行。(3)运行时数据区:主要包括方法区、Java堆、Java

45、栈、PC寄存器、本地方法栈等。每个JVM实例都有一个方法区和堆。方法区主要存放类装载器加载的.class文件、类的静态变量。堆主要存放所有程序在运行时创建的对象或数组。方法区和堆由所有线程共享。,每个线程都有自己的PC寄存器和Java栈。PC寄存器的值指示下一条将被执行的指令。Java栈记录存储该线程中Java方法调用的状态。每当启动一个新线程,JVM都会创建一个新的Java栈,用于保存线程的运行状态,包括局部变量、参数、返回值、运算的中间结果。本地方法栈:存储本地方法调用的状态。,当启动一个Java程序时,就会产生一个JVM实例。该程序关闭退出后这个JVM实例也就随之消亡。每个Java程序都

46、运行在自己的Java虚拟机实例中。Java虚拟机实例通过调用某个初始类的main()方法来运行一个Java程序。main()方法是该程序初始线程的起点,任何其他的线程都是由这个初始线程启动的。,1.4.2 Java Application程序的建立及运行Java Application程序的建立及运行可分为下述三个步骤:(1)在NetBeans IDE中创建一个项目。通过在NetBeans IDE中选择相应的菜单项来创建一个项目,就可以在这个项目中建立和运行Java程序,免去了许多在使用Javac编译器和Java解释器时需做的配置工作。(2)建立Java源程序文件,产生.class字节码文件。

47、通过选择IDE中相应的菜单生成一个Java框架源文件,然后修改、添加自己的Java源程序,并存储。IDE会自动调用Javac编译器将该源程序编译为字节码文件,并存储在该项目的build文件夹中。,(3)解释器解释字节码文件,完成该程序的运行。通过选择IDE中相应的菜单,IDE会自动调用Java解释器来解释该项目build中的字节码文件,产生运行结果。下面通过示例程序C1_1.java的建立和执行来详细讲述这一过程。当然,也可以在网站中学习。,【示例程序C1_1.java】编写一个输出字符串“My first Java Application!”的Application程序。package ch

48、1;public class C1_1 public static void main(String args)System.out.println(“My first Java Application!”);,1.创建一个IDE项目启动 NetBeans IDE后,单击图1.8所示菜单栏中的“文件”选项,在出现的下拉菜单中单击选择“新建项目”菜单项,弹出如图1.9所示的“新建项目”对话框。在这个对话框中依次选择“Java”文件夹、“Java应用程序”。然后,点击“下一步”按钮,弹出如图1.10所示的“新建Java应用程序”对话框。,图1.8 建立一个项目的操作界面,图1.9“新建项目”对话框

49、,图1.10“新建Java应用程序”对话框,在“新建Java应用程序”对话框输入项目名称、项目存放位置、主类名等。本例给出的项目名为“ch1”,项目的存放位置为“E:Java”,项目文件夹为“E:Javach1”,主类名(也是文件名)是“ch1.C1_1”。注意:文件的扩展名在此界面中不需输入,系统会自动取默认的“.java”。完成上述输入后,单击“完成”按钮,弹出如图1.11所示的编程界面。在图1.11的界面中显示了所创建项目“ch1”的有关信息和程序文件“C1_1.java”的空框架。在此界面中进行Java程序编写,实际上就是在空框架的基础上进行编辑工作。图1.12显示了项目“ch1”和该

50、项目中的文件“C1_1.java”的存放位置。,图1.11 ch1项目的IDE界面,图1.12 建好的“ch1”项目的文件位置,2建立Java Application源程序本例建立的C1_1.java源程序如图1.13所示。3编译运行Java Application源程序运行C1_1程序有两种方法:一是在图1.13的菜单栏中选择“运行”“运行主项目”;二是在图1.13右侧的程序窗口中单击右键,在出现的快捷菜单中选择“运行文件”。此时,IDE会自动调用Javac编译器将该程序编译成字节码文件,并存储在该项目的build文件夹中,见图1.13左上窗口所示。如果编译Java Application源

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号