文章目录
java的概述
1.1java的发展历史
1991年,sun公司的詹姆斯·高斯林(java的创始人之一,公认的java之父)领导的Green小组,需要研发与开发面向家电市场的软件产品。研究小组原想扩充C++作为编程语言,但发现C++在简单性和安全性方面无法满足集成控制软件运行可靠、高效的要求。另外C++程序必须针对特定的计算机芯片和软件库进行编译,而消费类设备控制芯片的更新十分频繁,这将使C++编写的控制程序频繁进行重编译与调试,给设备的更新换代带来很大的负担。因此在研究小组成立不久.James Gosling就着手设计一种新的语言。考虑到C/C++的优良特性与应用的广泛性.James Gosling便决定主要以C++为基础进行新语言的设计,从而创建了新的程序设计语言Oak(橡树)。该语言与C/C++等传统程序设计语言不同,具有突出的平台独立性、高度的可靠性和安全性特点。
1992年8月,Oak与一种称为GreenS的操作系统、用户接口块、硬件模块一起集成为一种类似于个人数字助理(PAD)的设备StarSeven。StarSeven成功地表现了高效的小程序代码技术,获得了Sun公司决策层的好评,从而使Green小组升级为First Person子公司。First Person的初衷是将Star Seven的技术移植到合适的商业产品中,然而由于种种商业原因,1994年,First Person遭到接连失败,最终因毫无业绩而解体。
此时,Internet上的WWW的发展方兴未艾,已经从字符界面发展到了图形界面。但WWW上传输的是静态的信息,不具有交互性和动态性。Sun的决策层意识到用Oak编写的小程序正好可以弥补WWW的上述不足:运行于浏览器中Oak小程序可以实现与用户的交互,使WWW具有交互性和动态性。于是Sun决定将Oak技术与WWW技术结合起来,并采用允许用户在Internet上免费使用的策略。
1995年1月,James Gosling和Patrick Naughton完成了Oak的新版本和第一个基于Oak的应用程序 Web Runner。Oak从此更名为Java;Web Runner也更名为HotJava,它是第一个支持Java的第二代WWW浏览器。在Java和HotJava通过 Internet 免费发布之后,Java的发展终于步人坦途。众多WWW厂商宣布支持Java。Microsof1、IBM、HPNetscape、Novell、Apple、DEC、SGI等著名的计算机公司纷纷购买了Java语言的使用权,使Java语言能够在多种平台中运行。
1995年夏,Sun公司在Internet上发起的Java编程竞赛,参加者踊跃;1995年秋Netscape公司获Sun公司批准在Navigator2.0的32位版中支持Java。现在,大部分WWW浏览器都能支持Java,使用Java开发nternet和Intranet应用也蔚然成风。
从此Java走上了快速发展的轨道。1996年1月,Sun发布了第一个Java开发工具包JDK1.0;1997年2月,Sun发布了JDK1.1;1998年12月,Sun发布了Java2平台及JDK1.2。Java2平台是Java技术发展的新的里程碑,标志着Java 技术发展的新阶段。
1999年6月,Sun重新定义了Java技术的架构,将Java2平台分为3个版本:标准版(Java 2 Standard Edition,J2SE)、企业版(Java 2 Enterprise Edition,J2EE)和微缩版(Java2Micro Ediion,J2ME)。其中,J2SE为桌面开发和低端商务应用提供了可行的解决方案,J2EE为开发企业级应用程序提供了一套技术,J2ME是致力于消费产品和嵌入式设备的开发人员的最佳选择。
2004年10月,Sun推出了JDK1.5,同时也将J2SE、J2EE和J2ME平台改称为JavaPlatform Standard Edition—Java SE,Java Platform Enterprise Edition—Java EE 和Java Platform Micro Edition—Java ME。JDK 1.5或J2SE 1.5 就相应改称为 Java SE5。JDK 1.5增加了一些新的特性,如泛型、增强的for 语句、可变数目参数、注释、断言以及自动装箱和拆箱功能。同时,Sun也发布了新的JavaEE规范,如EJB3.0规范、MVC框架规范等。
Java技术除了沿着JavaSE、JavaEE、JavaME 3种技术为主脉络迅速发展外,还密切关注Internet环境下各种新型信息技术的发展,并能够迅速与这些新技术融合,积极支持这些新技术应用的开发。例如Sun在Java技术中发布了对XML,Web Services以及P2P(Peer to Peer)等应用开发的支持工具。因此Java技术已经渗透到Internet 应用开发的很多方面,成为 Internet应用发展的重要支撑技术,并且具有强大的生命力。
1.2 Java技术体系
目前,Java已经发展成为庞大的技术体系。这个技术体系中主要有如下3个分支
(1)Java Platform Standard Edition----Java SE;
(2)Java Platform Enterprise Edition----Java EE
(3)Java Platform Micro Edition----Java ME。
(1).Java平台标准版 Java SE
Java SE的最早版本是JDK1.2。目前JavaSE仍然可以称为JDK。Java SE为Java桌面和工作组级应用的开发与运行提供了环境。它的实现主要包括 Java SE Development Kit(JDK)和 Java SE Runtime Environment(JRE)。 Java SE 是Java EE和 Java Web Services 技术的基础。
Java SE 提供了编写与运行 Java Applet与 Application 的编译器、开发工具、运行环境与Java API。图中显示了JavaSE8中包括Java语言在内的所有组成部分。
1)Java开发工具(Tools & Tools APIs)
包括Java语言的编译器、调试器以及文档工具等。
2)Java部署技术(Deployment)
提供了部署与运行Java应用的支持,包括以Web方式加载与运行Java Application的Java Web Start和支持Applet在Netscape Navigator 和 Microsoft Internet Explorer 浏览器中运行的 Java Plug-in。
3)用户界面工具集(User Interface Toolkits)
包括图形化用户界面工具AWT和Swing;二维图形和图像的显示与操作工具Java2D;声音捕获、处理与播放的Java Sound API;支持多种语言如中文、日文与朝鲜语等输人的输人法框架Input Method Framework;开发面向残疾人的Java应用的相关技术Accessibility.如屏幕识读器、语音识别系统和盲文显示系统等。
4)集成APl(Integration libraries)
包括分布式对象操作支持,如Java RMI(Remote Method Invocation,远程方法调用)技术与CORBA技术;数据库连接API–JDBC;向Java应用提供命名和目录服务的JNDIAPI等。
5)Java基本库(lang and util Base libraries,Other Base Libraries)
Java核心 API包含了实现Java平台基本特征与功能的类和接口,包括以下类别:输人/输出、网络通信、核心语言包java,lang和工具包 java.util、安全机制、国际化应用的支持、Java组件模型–JavaBeans API、处理XML文档和数据、记录应用系统安全及应用配置等方面信息的日志功能、存储与获取应用系统用户配置数据的Preferences API、集合操作类(collection)、调用本地方法的Java Native Interface(JNI)等。
6)Java 虛拟机(Java Virtual Machine)
Java SE 中包含了如下两种 Java 虛拟机 JVM 的实现。
(1)Java HotSpot Client VM:是 Java运行环境(Java Runtime Environment.JRE,有时也称为 Java 运行系统)默认的Java虚拟机。它最适于在客户端环境中运行Java应用,能够使应用的运行得到最佳的性能。
(2)Java HotSpot Server VM:是为在服务器端运行Java 应用而设计的,可以使这种环境下的应用系统得到最快的运行速度。通过在命令行使用-server参数启动这种类型的Java虚拟机,如java-server MyApp。
(2).Java 平台企业版 JavaEE
Java EE定义了基于组件的多层企业级应用的开发标准,面向企业级和高端服务器的Internet 应用开发。它基于Java SE,包括 Enterprise JavaBeans(E]B),Java Servlets API 以及Java Server Pages(JSP)等技术,并为企业级应用的开发提供了各种服务和工具。
Java EE的应用程序模型是一种多层模型(multi-tier model),如图所示。多层模型的各个层次分别是客户端表示层、服务器端表示层、应用逻辑层、企业信息系统层。Java EE应用系统的用户可以通过浏览器或Java Application等方式访问JavaEE应用。客户的操作请求被首先发送到服务器端表示层。该层由Web服务器构成,JSP和Servlet是Web服务器的重要组件。这些组件解析客户端发来的请求,并驱动后端应用逻辑层中实现相应应用逻辑的EJB组件完成用户请求的服务。EJB组件在实现服务操作时会根据需要存取企业信息系统中的数据,并把操作结果原路返回服务器表示端的JSP/Servlet,由JSP/Servlet把结果表达为HTML格式返回给客户端并在浏览器中显示,或由Servlet将结果返回给客户端的 Java Application。
(3).Java平台微缩版JavaME
Java ME是针对消费类电子设备如移动电话、电视置顶盒、汽车导航系统等的嵌入式计算的一组技术和规范。它在JavaSE的基础上,结合这类设备计算资源的限制对JavaSE进行了语言精简,并对运行环境进行了高度优化。
2.1 什么是Java 技术
对于多数程序设计语言,其程序运行要么采用编译执行方式,要么采用解释执行的方式。而Java语言的特殊之处在于,程序运行既要经过编译又要进行解释,如图所示首先,Java程序由编译器进行编译,产生一种中间代码,称为Java字节码(Java bytecodes)字节码是Java虚拟机(Java Virtual Machine,JVM)的代码,是平台无关的中性代码,因此不能在各种计算机平台上直接运行,必须在JVM上运行。Java解释器是JVM的实现,它把字节码转换为底层平台的机器码,使Java程序最终得以运行。无论是Application还是嵌人在浏览器中的Applet,都需要通过解释器才能运行。
Java 字节码使得“一次编程,到处运行”成为可能。可以在任何平台上,通过该平台的Java编译器把Java程序编译成字节码,该字节码便可以在任何平台的JVM 中运行。这意味着只要计算机上有JVM,同一个Java程序就可以在Windows,Linux或 MacOS等机器上运行.如图 所示。
2.2 Java的特征
在由 James Gosling 和 Henry McGilton等人撰写的 Sun 公司 Java白皮书中指出,Java是一种“简单(simple)、面向对象(object oriented)、分布式(distributed)、解释型(interpreted)、强壮(robust)、安全(secure)、体系结构中立(architecture neulral)、可移植(portable)、高性能(high performance)、多线程(multithreaded)和动态(dynamic)”的编程语言。对这些特征的理解.是领会Java语言精髓的关键。
1.简单性
Java语言句法和语义都比较单纯,容易学习和使用。另外,Java对C++中容易引起错误的成分进行了相当成功的改造,例如去掉指针,取消多重继承和运算符重载,内存管理由程序员移向 Java内嵌的自动内存回收机制等,从而简化语义,减少出错机会,减轻程序员负担Java还提供大量功能丰富的可重用类库,简化了编程工作量。例如,访问Internet 资源,在C++中需要编写大量复杂的程序,但使用Java 只需数行代码,其余工作由Java 类库完成。
2.面向对象
作为一种面向对象的编程语言,Java不仅最为“纯洁”,同时,它对面向对象方法学的支持也最为全面。与C++一样,Java的对象有模块化性质和信息隐藏能力,满足面向对象的封装要求。Java支持面向对象的继承性。另外,Java通过抽象类和接口(interface)支持面向对象的多态性要求,即一个对外接口,多种内部实现。
3.分布式特征
Java具有支持分布式计算的特征。分布式计算中,“分布”具有两层含义:一是数据分布.即应用系统所操作的数据可以分散存储在不同的网络节点上;二是操作分布,即应用系统的计算可由不同的网络节点完成。Java实现如下两种层次上的分布。
- 数据分布支持:通过Java的URL类,Java程序可以访问网络上的各类信息资源,访问方式完全类似于本地文件系统。
- 操作分布支持:Java通过嵌在WWW页面中的Apple1(小应用程序)将计算从服务器分布至客户机。Applet由WWW浏览器在客户端执行,从而避免了网络拥挤,提高了系统效率。
4.半编译,半解释特征
Java应用程序的执行过程具有半编译、半解释的特征。即采用编译器对程序进行编译,但编译得到的是一种中性的字节码,并不是本机代码,编译没有进行彻底,所以称为“半编译”。字节码的执行采取解释执行方式,这种解释执行与传统的解释执行的为别是:不是以源码为输入的,而是以程序编译后产生的字节码为输人,所以称为“半解释”
Java的半编译、半解释特征带来的主要优点如下所述。
- 提高了Java的可移植性。不仅源程序可移植,编译后的中间代码也可移植,而且字节码的移植还有利于程序源代码的保密。解释过程必然降低部分执行效率,但可以通过多种方法弥补,如研制以字节码为机器指令系统的Java芯片。
- 这种半编译、半解释的过程兼具编译执行的效率优势和解释执行的灵活性
5.强壮性
Java提供自动垃圾收集来进行内存管理,防止程序员在管理内存时出现容易产生的错误。通过集成的面向对象的例外处理机制,在编译时,Java提示出可能出现但未被处理的例外,帮助程序员正确地进行选择以防止系统的崩溃。另外,Java是一种强类型语言,程序编译时要经过严格的类型检查,防止程序运行时出现类型不匹配等问题。
6.安全性
在分布式环境中,安全性是一个十分重要的问题。Java在语言和运行环境中引人了多级安全措施,其采用的主要安全机制有如下两种。
- 内存分配及布局由Java运行系统规定。
首先内存布局并不是像C和C++一样由编译器决定,而是由运行系统决定,内存布局依赖于Java运行系统所在的软硬件平台的特性。其次,程序中内存引用关系不是用内存单元指针,而是用符号代表。Java并没有传统C和C++意义上的内存单元指针,Java编译器是通过符号指针来引用内存,由Java运行系统在运行时将符号指针解释为实际的内存地址,Java程序员不能强制引用内存指针。因此,Java的内存分配和引用模型对于程序员是透明的,它完全由底层的运行系统控制,Java程序无法破坏不属于它的内存空间。 - 运行系统执行基于数字签名技术的代码认证、字节码验证与代码访问权限控制的安全控制模型。
Java的运行系统对Java应用程序尤其是Applet依据安全模型进行全面的控制。通过类加载器、字节码验证器等保证运行Java程序对运行主机内存的安全,进一步通过建立保护域、访问控制策略、访问控制机制,对代码的来源进行确认并对代码的本地资源(如文件网络端口等)的访问进行严格的权限控制,以保证主机本地资源的安全。下面简单介绍字节码验证器的安全功能。
Java编译器虽然保证了Java源代码不违背安全规则,但在浏览器中的Java小程序是从其他地方引人的代码段,Java运行系统并不知道这些代码是否满足Java语言的安全规则,网络病毒和其他形式的人侵者可以绕过Java编译器生成有危险的字节代码,因此Java运行系统并不应该信任这些外来的代码,需要对它们进行字节码的验证。因此在Java 运行系统中引人了字节码验证器。在字节码执行前,字节码验证器将每个输入代码段送给一个简单的规则验证程序,以确保代码段遵循如下规则。- 不存在伪造的指针。
- 未违反访问权限。
- 严格遵循对象访问规范来访问对象
- 用合适的参数调用方法。
- 没有栈溢出等。
通过语言的内在安全机制,再加上字节码的验证过程,Java建立了一套严密的安全体系。
7.体系结构中立
Java语言的设计不是针对某种具体平台结构的。Java为了做到结构中立,除了上面提到的编译生成机器无关的字节码外,还制定了完整统一的语言文本。如Java的基本数据类型不会随目标机的变化而变化,一个整型总是32位,一个长整型总是64位。像C和C++这样的现代程序设计语言并不满足这一点,不同的编译器和开发环境之间总会有一些细微的不同。
为了使Java的应用程序不依赖于底层具体的系统,Java语言环境还提供了一个用于访问底层操作系统功能的可扩展类库,例如核心语言类库java.lang、实用工具类库java.util、输人/输出类库java.io、网络通信类库java.net、图形用户界面工具类库java.awt、支持Applet 的类库java.applet等。当程序使用这些库时,可以确保它能运行在支持Java的各种平台上。
8.可移植性
Java是迄今为止对可移植性支持最佳的编程语言。Java的最大特点是==“一次编程,处处运行”==。任何机器只要配备了Java解释器,便可运行Java程序。这种可移植性源于两方面:一方面是 Java的半编译、半解释特征;另一方面是Java体系结构中立,采用标准的独立于硬件平台的数据类型,对数据类型都有严格的规定,并且不会因为机器的不同而改变
9.高性能
Java语言虽然采取字节码解释运行方式,但由于字节码与机器码十分接近,使得字节码到机器码的转换十分快捷。另外,Java还提供了即时编译技术,即将要执行的字节码一次编译为机器代码,再全速运行,提高了Java应用的运行速度。这些使得Java语言在实现了可移植等特性的同时,又具有高性能。
10.多线程
线程是比进程更小、开销更少的并发执行单位,它与进程的主要差异在于它不拥有单独的资源,而是与其他线程共享所属进程的资源。在Java语言出现之前,线程机制已经在操作系统领域广泛使用,并在改善系统运行效率方面取得了明显的效果。像Windows,OS/2等新型操作系统,都支持多任务的并发处理。Java的特点是在语言级嵌入了多线程机制、支持程序的并发处理功能。从程序的角度看,一个线程就是应用程序中的一个执行流。一个Java程序可以有多个执行线程。
多线程程序设计的最大问题是线程的同步。其基本原理是C.A.R.Hoare提出的,并在许多新型操作系统中广泛使用临界区保护规则。Java将这些原理集成到语言中,使这些规则的使用更加方便有效。
如果底层的操作系统支持多线程,Java的线程通常被映射到实际的操作系统线程中,这意味着在多机环境下,用Java写的程序可以并行执行。
11.动态特征
Java的动态特性是其面向对象设计的延伸。Java程序的基本组成单元是类,而Java的类又是运行时动态装载的,这使得Java可以动态地维护应用程序及其支持类之间的一致性,而不用像C++那样,当其支持类库升级之后,相应的应用程序都必须重新编译。
3.1 java语法机制概述
Java 的基本语法机制,例如数据类型、表达式、程序流控制、结构化异常处理等,都基于C++,但又具有明显区别于C++的语法机制,包括类(class)、接口(interface)、程序包(package)、多线程以及取消指针。
-
类
类是Java中最基本、最重要的语法元素。Java中类的定义与类的继承都与C++类似它们之间的区别主要有如下两点。-
Java不允许一个类同时继承多个父类。在Java中,多重继承必须通过接口来实现。
-
除C++的修饰词public、protected和private之外,Java还引进了abstract 和final修饰词。
带 abstract的类称为抽象类。抽象类的抽象方法只定义方法的声明(函数名、参数及其类型),没有方法体。抽象类只能供其他类作为父类使用,不能直接通过new运算符产生抽象类的对象。final可修饰类、属性或方法。带final的类不能作父类被继承,带final的属性在赋初值或第一次赋值后将不允许改变,成为常量。在方法定义时,使用final修饰词可以防止子类重写该方法。
-
-
接口
接口是一种“抽象类”,接口中只能出现静态常量或抽象方法的定义。Java引进接口的主要目的是实现多重继承功能,同时又避免C++多重继承在语义上的复杂性。类可以通过实现一个或多个接口来实现多重继承。
-
程序包
程序包是一些相关类或接口的集合。Java系统提供的可重用类都以包的形式供软件开发人员使用,例如Java语言包java.lang等。无论是使用Java系统提供的标准程序包,还是使用自定义程序包,在程序中都是通过import语句将相应的包引入的。
-
多线程
为了让软件开发人员在程序中利用操作系统的多线程处理能力,操作系统通常提供有关线程管理的API函数供开发人员使用。但Java直接在语言级支持多线程。这将使开发人员不必考虑不同操作系统平台多线程处理机制的差异,从而使应用软件具有好的可靠性和可移植性。
-
取消指针
C++的指针是一种有争议的语法机制。一方面,它非常灵活,程序员可利用它指向任意内存块;另一方面,它也是公认的较易引发程序错误和内存泄漏的语法元素。Java取消了指针类型,所有动态内存的申请均通过new运算符进行,连数组内存空间的申请也不例外,在Java 中通过 new得到的不是指针,而是引用(reference),通过该引用能够找到目标对象Java程序只能通过引用访问数组元素或对象,不能像使用C++指针那样通过修改引用的值来指向另一内存区。这样既减少了出错机会,也使系统能够自动判别某块内存是否可以回收。