1、JavaOverview杨之江yangzhijiang@126.comJava的起源Java来自于Sun公司的一个叫Green的项目,其原先的目的是实现智能家电控制。开始,准备采用C++,但C++太复杂,安全性差,最后基于C++开发了一种新的语言Oak(Java的前身),Oak是一种用于网络的精巧而安全的语言,Sun公司曾以此投标一个交互式电视项目,但结果被SGI打败。可怜的Oak几乎无家可归,恰巧这时MarkArdreesen开发的Mosaic和Netscape启发了Oak项目组成员,他们用Java编制了HotJava浏览器,得到了Sun公司首席执行官ScottMcNealy的支持,触发了Java进军Internet。关键词绿色计划Green与平台无关Java最初的名字:橡树Oak一杯飘香的咖啡Java网络与JavaAndroidTheNetworkistheComputer网络就是计算机1JavaOverviewLanguageHistoryWhatJavaDoesforYouWhyPortabilityMattersLanguageandLibrariesOneSizeDoesn'tFitAllSomeLightRelief—AJavaDesktopApplication5Languagehistory•Machine-Asm-C,C++…-Sql,perl..•C++-Java?•WhereisC#?JavaHistoryMarch23,1995:Javaisborn.Father:JamesGoslingsMother:SunMicrosystems.Java2v1.6(6.0),December2006Java2v7.0,20116Javavs.C++Similarsyntax/controlstructures.Nopreprocessororincludefiles.NopointersNoglobalvariablesNostructoruniontypes.Allprimitivetypeshavewelldefinedsize.X86,x64NooperatoroverloadingString?9MoreJavavs.C++Singleinheritanceonlythereisanotherapproachused-interfaces.Errorhandlingiswelldefined(andsomewhatenforced!).NomemoryleaksSafetydesignedintothelanguageandVMbytecodeverificationarrayaccessboundscheckingsecuritymanager/securitypolicies10Simple:KISSDynamicMemoryManagementgarbagecollectionThreads,synchronizationprimitivesErrorhandling(exceptions)NetworksupportSecurityExtensivelibrary.11JavaStrengthsSoftwarePortabilityOracle,marsKissthelanguageitselfObjectmodelGraphicalUserInterface(GUI)programmingLargeandVeryLargesystems.PortablelibrariesCodeDocumentation(andother)tools.JavaDoc12WhatJavaDoesforYouSoftwarePortabilityupgradeOSandapplicationsindependentlyskillsportabilityforprogrammers13Java6Platform14我们为什么要用Java简单的面向对象的健壮的安全的解释的与平台无关的多线程的动态的语言我们为什么要用JavaJava语言的简单性主要体现在三个方面:1、Java的风格类似于C++,因而C++程序员初次接触Java语言,就会感到很熟悉。从某种意义上讲,Java语言是C及C++语言的一个变种,因此,C++程序员可以很快地掌握Java编程技术。2、Java摒弃了C++中容易引发程序错误的一些特性,如指针、结构、枚举以及内存管理等。3、Java提供了丰富的类库,可以帮助我们很方便的开发Java程序。我们为什么要用Java面向对象的面向对象可以说是Java最重要的特性,所以它支持继承、重载、多态等面向对象的特性。Java语言的设计是完全面向对象的,它不支持类似C语言那样的面向过程的程序设计技术。我们为什么要用Java健壮的Java致力于检查程序在编译和运行时的错误。Java也是一种强类型的语言,其类型检查比C++还要严格。类型检查帮助我们检查出许多开发早期出现的错误。Java自己负责内存管理,提供了垃圾内存回收机制,有效的避免了C++中最头疼的内存泄漏问题。我们为什么要用Java安全的Java的安全性可从两个方面得到保证。一方面,在Java语言里,删除了指针和释放内存等C++功能,避免了非法内存操作。另一方面,通过Java的安全体系架构来确保Java代码的安全性。当我们从网上下载Java代码在本地执行时,Java的安全架构能确保恶意的代码不能随意访问我们本地计算机的资源,例如:删除文件,访问本地网络资源等操作都是被禁止的。我们为什么要用Java解释的Java代码是解释执行的,我们使用Java编译器将Java代码编译成字节码,这是一种中间代码,然后由Java解释器解释执行。而C++程序是编译执行的,C++程序代码被编译为本地机器指令,然后执行。我们为什么要用Java与平台无关的Java作为一种网络语言,其源代码被编译成一种结构中立的中间文件格式。只要有Java运行系统的机器都能执行这种中间代码。Java源程序被编译成一种与机器无关的字节码格式,在Java虚拟机上运行。我们为什么要用Java多线程的Java语言的一个重要特性就是在语言级支持多线程的程序设计。我们为什么要用Java动态的Java的动态特性是其面向对象设计方法的扩展。它允许程序动态地装入运行过程中所需要的类。在C++程序设计过程中,每当在类中增加一个实例变量或一个成员函数后,引用该类的所有子类都必须重新编译,否则将导致程序崩溃。Java从以下几个方面采取措施来解决这个问题。1、Java编译器不是将对实例变量和成员函数的引用编译为数值引用,而是将符号引用信息在字节码中保存下来,传递给解释器,再由解释器在完成动态连接类后,将符号引用信息转换为数值偏移量。2、一个在存储器中生成的对象不在编译过程中决定,而是延迟到运行时由解释器确定。这样,对类中的变量和方法进行更新时就不至于影响现存的代码。3、解释执行字节码时,这种符号信息的查找和转换过程仅在一个新的名字出现时才进行一次,随后代码便可以全速执行。在运行时确定引用的好处是可以使用已被更新的类,而不必担心会影响原有的代码。如果程序连接了网络中另一系统中的某一类,该类的所有者也可以自由地对该类进行更新,而不会使任何引用该类的程序崩溃。Java的解释性Java语言分两步执行1)由编译器将用户程序编译成字节码2)由Java虚拟机(JavaVirtualMachine)解释执行字节码可以在不同的硬件平台上实现不同的Java虚拟机,保证了Java语言的平台无关性和可移植性。Java的工作原理JavaApplicationJavaAppletServlets(JSP)JavaAPIWebServer字节码BytecodesJavaVirtualMachine(JVM)HardwarePlatformJava虚拟机软件模拟的计算机执行字节码文件(*.class)不同的软硬件平台需要对Java虚拟机做专门的实现JVM(虚拟机)JavaVirtualMachineCommonLanguageRuntime(CLR)UsingaVMisslowerthancompilingtonativeinstructions.JITcompilersconvertJavaBytecodetomachinelanguage.Safety/SecurityslowthingsdownallarrayaccessesrequireboundscheckManyI/Ooperationsrequiresecuritychecks27JVM规格描述JVM的设计目标是提供一个基于抽象规格描述的计算机模型,为解释程序开发人员提供很好的灵活性,同时也确保Java代码可在符合该规范的任何系统上运行。JVM对其实现的某些方面给出了具体的定义,特别是对Java可执行代码,即字节码(Bytecode)的格式给出了明确的规格。这一规格包括操作码和操作数的语法和数值、标识符的数值表示方式、以及Java类文件中的Java对象、常量缓冲池在JVM的存储映象。这些定义为JVM解释器开发人员提供了所需的信息和开发环境。Java的设计者希望给开发人员以随心所欲使用Java的自由。JVM是为Java字节码定义的一种独立于具体平台的规格描述,是Java平台独立性的基础。Java跨平台的原理Java的跨平台是通过Java虚拟机(JVM)来实现的。Java源文件的编译过程Java编译程序将Java源程序翻译为JVM可执行代码—字节码。这一编译过程同C/C++的编译有些不同。当C编译器编译生成一个对象的代码时,该代码是为在某一特定硬件平台运行而产生的。因此,在编译过程中,编译程序通过查表将所有对符号的引用转换为特定的内存偏移量,以保证程序运行。Java编译器却不将对变量和方法的引用编译为数值引用,也不确定程序执行过程中的内存布局,而是将这些符号引用信息保留在字节码中,由解释器在运行过程中创建内存布局,然后再通过查表来确定一个方法所在的地址。这样就有效的保证了Java的可移植性和安全性。Java解释器的执行过程运行JVM字节码的工作是由解释器来完成的。解释执行过程分三步进行:代码的装入、代码的校验和代码的执行。装入代码的工作由“类装载器”(classloader)完成。类装载器负责装入运行一个程序需要的所有代码,这也包括程序代码中的类所继承的类和被其调用的类。当类装载器装入一个类时,该类被放在自己的名字空间中。在本台计算机上的所有类都在同一地址空间内,而所有从外部引进的类,都有一个自己独立的名字空间。这使得本地类通过共享相同的名字空间获得较高的运行效率,同时又保证它们与从外部引进的类不会相互影响。当装入了运行程序需要的所有类后,解释器便可确定整个可执行程序的内存布局。解释器为符号引用同特定的地址空间建立对应关系及查询表。通过在这一阶段确定代码的内存布局,Java很好地解决了由超类改变而使子类崩溃的问题,同时也防止了代码对地址的非法访问。随后,被装入的代码由字节码校验器进行检查。校验器可发现操作数栈溢出,非法数据类型转换等多种错误。通过校验后,代码便开始执行了。Java字节码的两种执行方式1、即时编译方式:解释器先将字节码编译成机器码,然后再执行该机器码。2、解释执行方式:解释器通过每次解释并执行一小段代码来完成Java字节码程序的所有操作。通常采用的是第二种方法。由于JVM规格描述具有足够的灵活性,这使得将字节码翻译为机器代码的工作具有较高的效率。对于那些对运行速度要求较高的应用程序,解释器可将Java字节码即时编译为机器码,从而很好地保证了Java代码的可移植性和高性能。Java程序执行与C/C++程序执行的对比分析如果把Java源程序想象成我们的C++源程序,Java源程序编译后生成的字节码就相当于C++源程序编译后的80x86的机器码(二进制程序文件),JVM虚拟机相当于80x86计算机系统,Java解释