文章目录
Java简介
1. Java名字由来
- Java的历史要追溯到1991年,Sun公司的一个工程师小组想要设计一种小型的计算机语言,希望用于有线电视转换盒之类的消费设备。由于这些消费设备的处理能力和内存都有限,所以这个语言必须非常小。而且要能够生成很紧凑的代码。并且厂商会选择不同的中央处理器(CPU) ,因此语言不应于任何特定的体系结构绑定。这个项目被命名为“Green”。
- 代码短小,紧凑且与平台无关,这些要求促使开发团队设计出一个可移除的语言。
- Sun公司的人都有UNIX的应用背景。因此,所开发的语言以C++为基础,正如Gosling在专访中谈道:“毕竟,语言只是实现目标的工具,而不是目标本身。”Gosling把这种与语言称为“Oak‘”(这么起名大概是因为他非常喜欢他在Sun公司的办公室窗外的一棵橡树)。Sun公司的人后来发现,已经有另外一个计算机语言取名为Oak,于是,他们将这个语言改名为Java。
2. Java发展简史
-
1996年年初,Sun公司发布了Java的第1个版本。人们很快意识到Java 1.0不能用来完成真正的应用开发,坦率的讲,Java1.0 的确没有为其黄金时期的到来做好准备。
-
1997年,Sun公司发布Java 1.1版本。它修复了太多明显的缺陷,大大改进了反射能力,并为GUI编程增加了新的事件处理模型。不过它仍然有很大的局限性
-
1998年~2001年,Sun公司分别发布Java1.2版本 、Java1.3版本、Java1.4版本。它做出了增量式的改进,提供了不断扩展的标准类库,提高了性能。在此期间,原先对Java applet和客户端应用的炒作逐渐消退,但Java成了服务器端应用的首选平台。
-
2004年,Java5.0版本诞生,5.0版是自1.1版本以来第一个对Java语言做出重大改进的版本。这个版本添加了泛型类型(generic type,大致相当于C++的模板),其挑战性在于添加这一特性而不需要对虚拟机做任何修改。另外,受到C#的启发,还增加了几个很有用的语言特性:“foreach”循环 、自动装箱和注解。
-
2006年,发布Java 6版本,这个版本没有对语言方面在进行修改,而是做了一些性能改进,并增加了类库。
-
随着数据中心越来越依赖于商业硬件而不是专用服务器,Sun公司终于陷入困境,于2009年被Oracle公司收购。Java的开发停滞了很长一段时间。直到2011年Oracle发布了Java的第一个版本------Java 7,其中只做了一些简单的改进。
-
2014年,Java 8 终于发布,在近20年中这个版本的改变最大。Java 8 包含了一种“函数式”编程方式,可以很容易地表达能并发执行的计算。
-
此后,从2018年开始,每6个月就会发布一个Java版本,以支持更快地引入新特性。每过一段时间,会把某个版本(如 Java 11 和 Java 17)指定为长期支持版本。中间版本提供了一种试验新特性的机制。
-
下图表格展示了Java语言及类库的演进。可以看到,API的规模有了惊人的增长。
版本 年份 新语言特性 类与接口的数量 1.0 1996 语言本身 211 1.1 1997 内部类 477 1.2 1998 strictfp修饰符 1524 1.3 2000 无 1840 1.4 2002 断言 2723 5.0 2004 泛型类、“for each”循环、可变参数、自动装箱、元数据、枚举、静态导入 3279 6 2006 无 3793 7 2011 基于字符串的Switch语句、菱形运算符、二进制字面量、异常处理增强 4024 8 2014 Lamda表达式、包含默认方法的接口、流和日期/时间库 4240 9 2017 模块、其他的语言和类库增强 6005 11 2018 局部变量类型推导(var)、Http客户端,移除Java FX、JNLP、Java EE重叠模块和CORBA 4410 17 2021 Switch表达式、文本块、instanceof模式匹配、记录、密封类 4859
3. Java主要优势
一. 简单性
1. Java剔除了 C++ 中许多很少使用,难以理解、容易混淆的特性
2. "简单"的另一方面是"小"。Java的目标之一是支持开发能够在小型机器上独立运行的软件。基本的解释器和类支持大约仅为40KB,在加上基础的标准类库和线程支持,大约需要增加175KB;在当时,这是一个了不起的成就。当然,由于不断的扩展,类库已经相当庞大了。现在还有一些带有较小类库的独立版本,这些版本适用于嵌入式设备和智能卡
二. 面向对象
1. 开发Java时面向对象技术已经相当成熟。Java的面向对象特性与C++旗鼓相当。简单的讲,面向对象是一种程序设计技术。它将重点放在数据(即对象)和对象的接口上; 用木匠打一个比方:
一个"面向对象的"木匠主要关注的是所制作的椅子,其次才是使用的工具;
而一个"非面向对象的"木匠主要考虑的则是使用的工具
三. 分布式
1. Java有一个丰富的例程库,用于处理Http 和 Ftp 之类的TCP/IP协议。Java应用程序能够通过URL打开和访问网上的对象,其便捷程度就好像访问本地文件一样
四. 健壮性
1. Java的设计目标之一是要让用Java编写的程序具有多方面的可靠性。Java非常强调进行早期的问题检测、后期的动态(运行时)检测,以及消除容易出错的情况
五. 安全性
从一开始,Java就设计成能够规范各种攻击,其中包括:
1. 运行时堆栈溢出,这是蠕虫和病毒常见的攻击手段。
2. 破坏自己的进程空间之外的内存。
3. 未经授权读写文件。
起初,Java对下载代码的态度是"尽管来吧!",不可信代码在沙箱环境中执行,在这里它不会影响主系统。用户可以确信不会发生不好的事情,因为Java代码不论来自哪里,都不能逃离这个沙箱。
不过,Java的安全模型很复杂。Java开发包(Java Development Kit,JDK)的第一版发布之后不久,普林斯顿大学的一些安全专家就发现一些小Bug会允许不可信的代码攻击主系统。
最初安全Bug可以快速修复。遗憾的是,经过一段时间之后,黑客已经很擅长找出安全体系结构实现中的小漏洞。Sun公司以及之后的Oracle公司为不断修复Bug经历了一段很是艰难的日子。
遭遇多次高调攻击之后,浏览器开发商和Oracle公司变得越来越谨慎。有一段时间,远程代码必须有数字签名。如今,通过浏览器交付Java应用已经是很遥远的记忆。
六. 体系结构中立
编译器生成一个体系结构中立的目标文件格式(class文件),这是一种编译型代码。这些编译型代码可以在很多处理器上运行(只要他们有Java运行时系统,不同的操作系统有不同的JDK版本包)。Java编译器通过生成与特定计算机体系结构无关的字节码指令来实现这一特性。精心设计的字节码不仅可以很容易地在任何机器上解释执行,而且可以很容易地动态转换为原生机器代码
- 当然,解释虚拟机指令肯定比全速运行机器指令要慢很多。不过,虚拟机有一个选项,可以将执行最频繁的字节码序列转换成机器码,这一过程称为即时编译(just-in-time compilation)
七. 可移植性
在Java中,数值类型有固定的字节数,这消除了代码移植时一个令人头痛的主要问题。二进制数据以固定的格式进行存储和传输,消除了有关字节码顺序的困扰。字符串则采用标准的Unicode格式存储
八. 解释性
Java解释器可以在任何移植了解释器的机器上直接执行Java字节码。由于链接(linking)是一个增量式的轻量级过程,所以,开发过程也会更加便捷,更具有探索性。
九. 高性能
尽管解释型字节码的性能通常已经足够让人满意,但在有些场合下还需要更高的性能。字节码可以(在运行时)动态转换为面向运行这个应用的特定CPU的机器码。
- 现在的即时编译器已经非常出色,可以与传统编译器相媲美,而且在某些情况下甚至超越了传统编译器,原因是它们有更多的可用信息。例如,即时编译器可以监控哪些代码频繁执行,并优化这些代码以提高速度。
十. 多线程
如今,我们非常关注并发性,因为摩尔定律即将走到尽头。我们不再追求更快的处理器,而是着眼于获得更多的处理器,而且要让他们保持繁忙。
Java在当时很超前,它是第一个支持并发程序设计的主流语言。
十一. 动态性
Java设计为能够适应不断演进的环境。库可以自由地添加新方法和实例变量。而对客户端没有任何影响。在Java中找出运行时类型信息十分简单。
且要让他们保持繁忙。
Java在当时很超前,它是第一个支持并发程序设计的主流语言。
十一. 动态性
Java设计为能够适应不断演进的环境。库可以自由地添加新方法和实例变量。而对客户端没有任何影响。在Java中找出运行时类型信息十分简单。