Java起源
Java是一种简单的、面向对象的、分布式的、解释的、安全的、可移植的、性能优异的多线程语言。它以其强安全性、平台无关性、硬件结构无关性、语言简洁、面向对象的特点,在网络编程语言中占据了无可比拟的优势,成为实现电子商务系统、企业管理平台、移动设备应用开发等的首选语言。
green小组的创建
1991年,SUN Microsystem公司的一个秘密项目——“Green”项目的一个研究小组在开发一种用于控制电视机、微波炉、冰箱、烤箱等家用电器的软件。这种软件能对这些设备进行控制并且联网,这些设备将能共存并且相互通讯,这显然是一个很吸引人的领域。最初对开发语言的选择,当然选择的是当时主流编辑语言c++,但是大家很快就发现了c++的缺陷,小组人员决定设计新的语言。
Green项目小组在开发这门新的语言时,将翻译过程分为两个步骤:
- 程序首先被翻译成中间语言。这种中间语言称为字节码,一个程序被翻译成字节码后,对所有电器都是相同;
- 然后再使用一种程序,将字节码翻译为特定电器的机器语言。这种程序既小又容易编写,因而也不会昂贵。
“Java”的由来
这门全新的编程语言被起名为“Oak”——源自一棵伫立在项目小组成员Gosling窗外的橡树。后来,项目组发现Oak这个名字已经被人注册。当小组成员在一家咖啡馆为该语言重新想名字时,他们发现手中的咖啡杯上都写着“Java”(他们喝的是爪哇岛产的咖啡),就灵机一动将Oak改名为Java。于是,Java语言应运而生。
Java的发展史
- java1.0发布:1996年1月23日发布了JDK1.0,并与1997年2月19日,Sun公司发布发布了JDK1.1。
- java2.0发布:1998年12月4日,JDK迎来了一个里程碑式的版本JDK 1.2,2000年5月8日发布了JDK1.3,2002年2月13日发布了JDK1.4。
- java5.0发布:2004年9月30日,迎来了又一个里程碑式版本。
- Java6.0发布:2006年12月11日发布了JDK1.6.
- ………..
在1999年,SUN公司将Java2平台划分为3大领域的3个版本:J2SE、J2EE和J2ME。J2SE(Java 2 Standard Edition)即Java标准版,主要用于桌面应用开发,它适用于普通PC及笔记本电脑,同时作为J2EE的基础。J2EE(Java 2 Enterprise Edition)即Java企业版,适用于服务器,重点定位于企业级别的分布式软件系统。J2ME(Java 2 Micro Edition)即Java微型版,主要用于嵌入式设备,例如手机、家电设备等,属于J2SE的一个子集,但是有其特殊类库支持。
java的组成
Java是一套完整的IT行业解决方案,包含了很多技术。从整体上划分,Java技术可以分成Java编程语言和Java平台。
java特点
Java编程语言是一种高级编程语言,其语言特征可以用如下词来归纳:
简单 | 结构中立 |
---|---|
面向对象 | 分布式 |
可移植性 | 高性能 |
多线程 | 健壮 |
动态 | 安全 |
简单性:
- 抛弃了C系语言中,对指针,内存,头文件等一系列不必要的功能。
- 基于C++语言基础之上,延伸出来的编程语言,它依旧遵循C系语言中绝大多数的说法。
- 由于前辈多,拥有非常丰富的API类库,让我们开发更加的简单。
面向对象:
- 万物皆对象,能够真实存在的肉眼看的到的所有东西都是对象。
类型是对象集合体的抽象,对象是类型的实例。
平台无关性:
- 在一个计算机上编译得到的字节码文件(就是.class文件),可以复制到任何一个安装了Java运行环境的计算机上直接运行。然后字节码文件由虚拟机负责解释执行,即Java虚拟机将字节码翻译成本地计算机的机器码,然后将机器码交给本地的操作系统运行。
由于在一个计算机上编译得到的字节码文件可以复制到任何一个安装了Java运行环境的计算机上直接使用,所以字节码其实是一种“中间代码”,这也就是为什么“Java语言能够一次编译,处处运行,也就是Java跨平台的原因。”所以称Java是一种“半编译,半解释的语言”,即源程序——>编译——>字节码——>字节码解释程序——>对应平台的机器语言。”
健壮性以及安全性:
- 抛弃了C系语言中,不必要的一些功能,避免了非法的内存操作。
- JVM提供的gc垃圾回收机制(普通gc,全量gc)。
- Java的异常处理机制。
多线程:
- 多线程机制使应用程序能够并行执行 ,而且同步机制保证了对共享数据的正确操作。通过使用多线程 ,程序设计者可以分别用不同的线程完成特定的行为 ,而不需要采用全局的事件循环机制 ,这样就很容易地实现网络上的实时交互行为。
Java平台
Java平台即由Java编程语言所撰写的软件赖以运行的平台,是Java软件和电脑系统的中介,最初被设计用在 Applet 等桌面端程序,不过后来逐渐转移到服务端的运用。
JVM虚拟机
虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java虚拟机屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。
指令系统
JVM指令系统同其他计算机的指令系统极其相似。Java指令也是由操作码和操作数两部分组成。操作码为8位二进制数,操作数进紧随在操作码的后面,其长度根据需要而不同。操作码用于指定一条指令操作的性质(在这里我们采用汇编符号的形式进行说明),如iload表示从存储器中装入一个整数,anewarray表示为一个新数组分配空间,iand表示两个整数的”与”,ret用于流程控制,表示从对某一方法的调用中返回。当长度大于8位时,操作数被分为两个以上字节存放。JVM采用了”big endian”的编码方式来处理这种情况,即高位bits存放在低字节中。这同 Motorola及其他的RISC CPU采用的编码方式是一致的,而与Intel采用的”little endian “的编码方式即低位bits存放在低位字节的方法不同。Java指令系统是以Java语言的实现为目的设计的,其中包含了用于调用方法和监视多线程系统的指令。Java的8位操作码的长度使得JVM最多有256种指令,java1.6及以上版本已使用了160多种操作码。
寄存器
所有的CPU均包含用于保存系统状态和处理器所需信息的寄存器组。如果虚拟机定义较多的寄存器,便可以从中得到更多的信息而不必对栈或内存进行访问,这有利于提高运行速度。然而,如果虚拟机中的寄存器比实际CPU的寄存器多,在实现虚拟机时就会占用处理器大量的时间来用常规存储器模拟寄存器,这反而会降低虚拟机的效率。针对这种情况,JVM只设置了4个最为常用的寄存器。它们是:pc程序计数器optop操作数栈顶指针frame当前执行环境指针 vars指向当前执行环境中第一个局部变量的指针 所有寄存器均为32位。pc用于记录程序的执行。optop,frame和vars用于记录指向Java栈区的指针。
栈结构
作为基于栈结构的计算机,Java栈是JVM存储信息的主要方法。当JVM得到一个Java字节码应用程序后,便为该代码中一个类的每一个方法创建一个栈框架,以保存该方法的状态信息。每个栈框架包括以下三类信息:局部变量,执行环境,操作数栈。
局部变量用于存储一个类的方法中所用到的局部变量。vars寄存器指向该变量表中的第一个局部变量。
执行环境用于保存解释器对Java字节码进行解释过程中所需的信息。它们是:上次调用的方法、局部变量指针和操作数栈的栈顶和栈底指针。执行环境是一个执行一个方法的控制中心。例如:如果解释器要执行iadd(整数加法),首先要从frame寄存器中找到当前执行环境,而后便从执行环境中找到操作数栈,从栈顶弹出两个整数进行加法运算,最后将结果压入栈顶。
操作数栈用于存储运算所需操作数及运算的结果。
碎片回收堆
Java类的实例所需的存储空间是在堆上分配的。解释器具体承担为类实例分配空间的工作。解释器在为一个实例分配完存储空间后,便开始记录对该实例所占用的内存区域的使用。一旦对象使用完毕,便将其回收到堆中。在Java语言中,除了new语句外没有其他方法为一对象申请和释放内存。对内存进行释放和回收的工作是由Java运行系统承担的。这允许Java运行系统的设计者自己决定碎片回收的方法。在SUN公司开发的Java解释器和Hot Java环境中,碎片回收用后台线程的方式来执行。这不但为运行系统提供了良好的性能,而且使程序设计人员摆脱了自己控制内存使用的风险。
存储区
JVM有两类存储区:常量缓冲池和方法区。常量缓冲池用于存储类名称、方法和字段名称以及串常量。方法区则用于存储Java方法的字节码。对于这两种存储区域具体实现方式在JVM规格中没有明确规定。这使得Java应用程序的存储布局必须在运行过程中确定,依赖于具体平台的实现方式。JVM是为Java字节码定义的一种独立于具体平台的规格描述,是Java平台独立性的基础。尽管JVM还存在一些限制和不足,有待于进一步的完善,但无论如何,JVM的思想是成功的。对比分析:如果把Java原程序想象成我们的C++原程序,Java原程序编译后生成的字节码就相当于C++原程序编译后的80x86的机器码(二进制程序文件),JVM虚拟机相当于80x86计算机系统,Java解释器相当于80x86CPU。在80x86CPU上运行的是机器码,在Java解释器上运行的是Java字节码。
Java解释器相当于运行Java字节码的“CPU”,但该“CPU”不是通过硬件实现的,而是用软件实现的。Java解释器实际上就是特定的平台下的一个应用程序。只要实现了特定平台下的解释器程序,Java字节码就能通过解释器程序在该平台下运行,这是Java跨平台的根本。当前,并不是在所有的平台下都有相应Java解释器程序,这也是Java并不能在所有的平台下都能运行的原因,它只能在已实现了Java解释器程序的平台下运行。
java程序编程接口(API)
Java API在Java安全性模型方面也有贡献。当Java API的方法进行任何有潜在危险的操作(比如进行本地磁盘写操作)之前,都会通过查询访问控制器来检验是否得到了授权。访问控制器是一个类,该类用来执行栈检验,以决定是否允许某种操作。