<转>Java的一些历史

 

Java是一种固执己见的语言,它具有很好的可读性,初级程序员很容易上手,具有长期稳定性和可支持性。但这些设计决定也付出了一定的代价:冗长的代码,类型系统与其它语言相比显得缺乏弹性。

然而,Java的类型系统已经在演化,虽然在语言的历史当中相对比较慢。我们来看看这些年来它的一些形式。

Java最初的类型系统

Java最初的类型系统至今已经超过15年了。它简单而清晰,类型包括引用类型和基本类型。类、接口或者数组属于引用类型。

  • 类是Java平台的核心,类是Java平台将会加载、或链接的功能的基本单位,所有要执行的代码都必须驻留于一个类中。
  • 接口不能直接实例化,而是要通过一个实现了接口API的类。
  • 数组可以包含基本类型、类的实例或者其它数组。
  • 基本类型全部由平台定义,程序员不能定义新的基本类型。

从最早开始,Java的类型系统一直坚持很重要的一点,每一种类型都必须有一个可以被引用的名字。这被称为“标明类型(Nominative typing)”,Java是一种强标明类型语言。

即使是所谓的“匿名内部类”也仍然有类型,程序员必须能引用它们,才能实现那些接口类型:

Runnable r = new Runnable() { public void run() { System.out.println("Hello World!"); } };

  

换种说法,Java中的每个值要么是基本类型,要么是某个类的实例。

命名类型(Named Type)的其它选择

其它语言没有这么迷恋命名类型。例如,Java没有这样的Scala概念,一个实现(特定签名的)特定方法的类型。在Scala中,可以这样写:

x : {def bar : String}

  

记住,Scala在右侧标示变量类型(冒号后面),所以这读起来像是“x是一种类型,它有一个方法bar返回String”。我们能用它来定义类似这样的Scala方法:

def showRefine(x : {def bar : String}) = { print(x.bar) }

  

然后,如果我们定义一个合适的Scala对象:

object barBell { def bar = "Bell" }

  

然后调用showRefine(barBell),这就是我们期待的事:

showRefine(barBell) Bell

这是一个精化类型(Refinement typing)的例子。从动态语言转过来的程序员可能熟悉“鸭子类型(Duck typing)”。结构精化类型(Structural refinement typing)是类似的,除了鸭子类型(如果它走起来像鸭子,叫起来像鸭子,就可以把它当作鸭子)是运行时类型,而这些结构精化类型作用于编译时。

在完全支持结构精化类型的语言中,这些精化类型可以用在程序员可能期望的任何地方,例如方法参数的类型。而Java,相反地,不支持这样的类型(除了几个稍微怪异的边缘例子)。

Java 5类型系统

Java 5的发布为类型系统带来了三个主要新特性,枚举、注解和泛型。

  • 枚举类型(Enum)在某些方面与类相似,但是它的属性只能是指定数量的实例,每个实例都不同并且在类描述中指定。主要用于“类型安全的常量”,而不是当时普遍使用的小整数常量,枚举构造同时还允许附加的模式,有时候这非常有用。
  • 注解(Annotation)与接口相关,声明注解的关键字是@interface,以@开始表示这是个注解类型。正如名字所建议的,它们用于给Java代码元素做注释,提供附加信息,但不影响其行为。此前,Java曾使用“标记接口(Marker interface)”来提供这种元数据的有限形式,但注解被认为更有灵活性。
  • Java泛型提供了参数化类型,其想法是一种类型能扮演其它类型对象的“容器”,无需关心被包含类型的具体细节。装配到容器中的类型通常称为类型参数。

Java 5引入的特性中,枚举和注解为引用类型提供了新的形式,这需要编译器特殊处理,并且有效地从现有类型层级结构分离。

泛型为Java的类型系统增加了显著额外的复杂性,不仅仅因为它们是纯粹的编译时特性,还要求Java开发人员应注意,编译时和运行时的类型系统彼此略有不同。

尽管有这些变化,Java仍然保持标明类型。类型名称现在包括List(读作:“List-of-String”)和Map, CachedObject>(“Map-of-Class-of-Unknown-Type-to-CachedObject”),但这些仍然是命名的类型,并且每个非基本类型的值仍是某个类的实例。

Java 6和7引入的特性

Java 6基本上是一个性能优化和类库增强的版本。类型系统的唯一变化是扩大注解角色,发布可插拔注解处理功能。这对大多数开发者没有任何影响,Java 6中也没有真正提供可插拔类型系统。

Java 7的类型系统没有重大改变。仅有的一些新特性,看起来都很相似:

  • javac编译器中类型推断的小改进。
  • 签名多态性分派(Signature polymorphic dispatch),用于方法句柄(Method handle)的实现细节,而这在Java 8中又反过来用于实现Lambda表达式。
  • Multi-catch提供了一些“代数数据类型”的小跟踪信息,但这些完全是javac内部的,对最终用户程序员没有任何影响。

Java 8的类型系统

纵观其历史,Java基本上已经由其类型系统所定义。它是语言的核心,并且严格遵守着标明类型。从实际情况来看,Java类型系统在Java 5和7之间没有太大变化。

乍一看,我们可能期望Java 8改变这种状况。毕竟,一个简单的Lambda表达式似乎让我们移除了标明类型:

() -> { System.out.println("Hello World!"); }

  

这是个没有名字、没有参数的方法,返回void。它仍然是完全静态类型的,但现在是匿名的。

我们逃脱了名词的王国?这真的是Java的一种新的类型形式?

也许不幸的是,答案是否定的。JVM上运行的Java和其它语言,非常严格地限制在类的概念中。类加载是Java平台的安全和验证模式的中心。简单地说,不通过类来表示一种类型,这是非常非常难的。

Java 8没有创建新的类型,而是通过编译器将Lambda表达式自动转换成一个类的实例。这个类由类型推断来决定。例如:

Runnable r = () -> { System.out.println("Hello World!"); };

  

右侧的Lambda表达式是个有效的Java 8的值,但其类型是根据左侧值推断的,因此它实际上是Runnable类型的值。需要注意的是,如果没有正确地使用Lambda表达式,可能会导致编译器错误。即使是引入了Lambda,Java也没有改变这一点,仍然遵守着标明类型。

Java 8的函数式编程怎么样?

最后,让我们回到本文开头提出的问题,“Java 8的函数式编程怎么样?”

Java 8之前,如果开发者想以函数式风格编程,他或她只能使用嵌套类型(通常是匿名内部类)作为函数代码的替代。默认的Collection类库不会为这些代码提供任何方便,可变性的魔咒也始终存在。

Java 8的Lambda表达式没有神奇地转变成函数式语言。相反,它的作用仍是创建强制的强命名类型语言,但有更好的语法支持Lambda表达式函数文本。与此同时,Collection类库也得到了增强,允许Java开发人员开始采用简单的函数式风格(例如filter和map)简化笨重的代码。

Java 8需要引入一些新的类型来表示函数管道的基本构造块,如java.util.function中的Predicate、Function和Consumer接口。这些新增的功能使Java 8能够“稍微函数式编程”,但Java需要用类型来表示它们(并且它们位于工具类包,而不是语言核心),这说明标明类型仍然束缚着Java语言,它离纯粹的Lisp方言或者其它函数式语言是多么的遥远。

除了以上这些,这个函数式语言能量的小集合很可能是所有大多数开发者日常开发所真正需要的。对于高级用户,还有(JVM或其它平台)其它语言,并且毫无疑问,将继续蓬勃发展。

时间: 2024-11-02 23:28:42

<转>Java的一些历史的相关文章

Java的发展历史

Java自1995诞生,至今已经20多年的历史. Java的名字的来源:Java是印度尼西亚爪哇岛的英文名称,因盛产咖啡而闻名.Java语言中的许多库类名称,多与咖啡有关,如JavaBeans(咖啡豆).NetBeans(网络豆)以及ObjectBeans (对象豆)等等.SUN和JAVA的标识也正是一杯正冒着热气的咖啡.据James Gosling回忆,最初这个为TV机顶盒所设计的语言在Sun内部一直称为Green项目.我们的新语言需要一个名字.Gosling注意到自己办公室外一棵茂密的橡树O

Java版本发展历史(转载自CSDN)

几年前,Java将死的话题被传得沸沸扬扬,特别是在甲骨文公司收购SUN公司后,几乎全世界的Java程序员都皱起了眉头.但随着Google Android平台的崛起以及大数据时代的来临,Java似乎又重新焕发了光芒. 2014年1月份,CSDN携手<程序员>杂志发起了"2013年中国软件开发者薪资大调查"在线调查活动,通过调查发现,使用Java的开发者高达45.39%,位居第一.而使用C#和C++的开发者仅为17.63%和13.37%. Java语言的开发性.兼容性和扩展性使

初识java——Java程序的历史、开发和运行

上了一节Java试听课,整理出如下笔记. Java最新版本下载 http://www.oracle.com/technetwork/java/javase/downloads/index.html 1.什么是java? 1.java面向对象编程语言. 2.java面向对象编程语言作用? 编写软件. 3.java的分类 1.深入程度 1.java的初级部分----(语法定义/常用程序类库使用) 2.java的高级部分----(特殊类库的使用) 2.使用平台[领域[行业]] 1.java  SE  

如何在官网下载java JDK的历史版本

工具/原料 网络连接,浏览器 方法/步骤 1 打开Oracle官网,准备下载java JDK(下载时需要使用注册用户登陆,可以免费注册) 官网地址:http://www.oracle.com/ 2 鼠标悬停Downloads,会出现相关内容,如下图: 3 点击“Java for Developers”,进入JDK下载页面: 4 可以看到下载页面如下,不过是最新的: 5 此页面最下面中有这一项,如下图. 内容大概是: (在Java档案提供一些我们的历史的Java版本. 警告:这些年长的JRE和版本

Java 的版本历史与特性

Java SE 8[2014-03-14发行] Lambda表达式 Pipelines和Streams Date和Time API Default方法 Type注解 Nashhorn JavaScript引擎 并发计数器 Parallel操作 移除PermGen Error TLS SNI Java Version SE 7[2011-07-28发行] switch语句块中允许以字符串作为分支条件: 在创建泛型对象时应用类型推断: 在一个语句块中捕获多种异常: 支持动态语言: 支持try-wit

java基础学习总结一(java语言发展历史、jdk的下载安装以及配置环境变量)

最近一段时间计划复习一下java基础知识,使用的视频课程是尚学堂高淇老师的,上课过程中的心得体会直接总结一下,方便以后复习. 一:计算机语言的发展 1:机器语言,最原始的语言,主要有“01”构成,最早的计算机使用电子管,01主要有高低电平控制.2:汇编语言,借助一些特殊符号,相比机器语言,更容易为人所理解,但是仍然不够人性化.3:高级语言,分为面向过程语言,例如C语言(贝尔实验室发明),和面向对象语言,例如C++.java.C#等. 二:java语言的发展 1:java语言是有sun公司发明的,

Java 语言的历史和起源

Java语言是从C++演变而来的一种可以撰写跨平台应用软件的面向对象的程序设计语言,Microsystems公司于 1995年5月推出的Java面向对象程序设计语言(以下简称Java语言)和Java平台的总称.由JamesGosling和同事们共同研发,并在1995年正式推出.用Java实现的HotJava浏览器(支持Java applet)显示了Java的魅力:跨平台.动态的Web.Internet计算.从此,Java被广泛接受并推动了Web的迅速发展,常用的浏览器均支持Javaapplet.

Java内存模型的历史变迁

转自:http://www.csdn.net/article/2015-05-20/2824722-Java 摘要:本文通过介绍Java的新/旧内存模型,来展示Java技术的历史变迁. 本文通过介绍Java的新/旧内存模型,来展示Java技术的历史变迁. 旧的Java内存模型 Java 使用的是共享内存的并发模型,在线程之间共享变量.Java语言定义了线程模型规范,通过内存模型控制线程与变量的交互,从而实现Java线程之间的通 信.在JDK5之前,Java一直使用的是旧内存模型.如图1所示.变量

Java基础_day1

学习内容: 1.Java的发展历史 2.jdk和jre的区别,功能. 3.jdk和jre的下载和安装 4.配置环境,path和classpath 5.helloworld程序 6.进制之间的转换 7.注释,标志符,常量 8.常见变量类型 总结: Java是由sun公司研发,其中jdk是针对开发人员的,jre是运行java程序的工具,java程序之所以跨平台,是由于虚拟机,其中jre包含虚拟机,jdk又包含jre,现在jdk最新版本是8.0版本,path是在windows操作系统上搭建环境时使用的