Java各版本语法增强特性

Java SE 8增强特性

·        Lambda 表达式可以封装一个简单的行为并把它传递到其他代码. 你可以使lambda表达式用特定的行为处理集合中的每一个元素. Lambda下面的特性使用了lambda表达式:

o   方法引用 是简洁的,可读性更高的lambda表达式。它用于引用已存在的方法.

o   默认方法 可以为接口添加一个新的功能,并且兼容较老的版本的接口. 他们是已实现的接口方法,方法开头以default  关键字标记,另外,可以在接口中定义静态方法.

o   StreamsJava SE 8中其他使用了Lambda表达式的新的和增强的API .

·        增强的类型推断- Java编译器通过目标的类型推断调用方法参数的类型. 基于表达式出现的地方,目标类型就是Java编译器希望的数据类型. 例如, 在Java SE 7中,可以使用声明的类型作为接口的类型. 然而, 在Java SE 8, 可以根据更多的上下文语义使用目标的类型作为接口的类型. 最突出的例子就是在调用方法时通过目标的类型推断出参数的数据类型.

考虑下面的代码:

List<String> stringList = newArrayList<>();

stringList.add("A");

stringList.addAll(Arrays.asList());

先不管上面的代码, 方法addAll像它声明的那样需要一个Collection 类型的参数, 同时,方法 Arrays.asList 返回一个 List 实例.这段代码可以工作是因为 List 是 Collection子类.

现在思考上面的代码, 目标类型的方法addAll 的参数是 Collection<? extends String>, 同时Arrays.asList 返回一个List<T> 实例. 在这个例子中, Java SE 8 编译器可以推断这个值的类型变量 T 是String. 编译器从目标类型 Collection<? extends String>推断出此结果.

Java SE 7及之前的编译器不能通过这个代码,因为它们没有在方法调用时使用目标类型推断. 例如, Java SE 7 产生类似下面的错误信息:

error: no suitable method found foraddAll(List<Object>) ...
method List.addAll(Collection<? extends String>) is not applicable(actual argument List<Object> cannot be converted to Collection<?extends String> by method invocation conversion)

如上, 这里不会推断参数的类型, 要保证代码正确,必须明确的指出参数的类型. 例如,在Java SE 7中代码如下:

List<String> stringList = newArrayList<>();

stringList.add("A");

stringList.addAll(Arrays.<String>asList());

可以参考下面Java教程中的章节获取更多信息:

o   目标类型 in Lambda表达式

o   类型推断

·        Java类型注解 – 现在注解可以应用在任何类型中.和其他可插拔的类型系统共同使用, 这可以在代码中实现强类型检查. 更多信息, 参考Java教程中注解 下面的类型注解和插件式类型系统 

·        重复注解 – 可以在声明的类型多次使用同一个注解. 更多信息, 参考Java教程中注解 下面的重复注解.

·        方法参数反射 -可以通过方法 java.lang.reflect.Executable.getParameters获取任意方法和构造方法的参数的名称. (类 Method 和Constructor 继承类 Executable ,所以继承方法 Executable.getParameters.) 然而, .class 文件没有存储参数的名称. 为了在.class 文件中存储参数名称,在编译源代码时,javac 编译器必须使用 -parameters 选项. 参考Java教程中的获取方法参数名称 .

Java SE 7增强特性

·        二进制表示法 – 在Java SE 7中, 数据类型 (byteshortint, 和long) 可以使用二进制表示. 为了指明是二进制, 需要在数字上加上前缀 0b 或者0B .

·        数字下划线表示法 – 可以在数字的任意地方加上下划线(_). 这个特性可以将数字分割成多个组, 以提高代码的可读性.

·        switch语句块中使用String – 可以在switch表达式声明中使用String 类.

·        创建实例时的类型推断 – 可以在构造方法中使用空的类型参数(<>)替代参数声明,编译器会根据上下文推断类型参数. 这对尖括号(<>)被称作钻石.

·        当在泛型方法中使用不可靠参数时,编译器产生警告或错误 –当使用不可靠的泛型参数声明一个泛型的方法或构造函数时Java SE 7编译器会产生警告. Java SE 7引进编译器选项-Xlint:varargs 和注解@SafeVarargs , @SuppressWarnings({"unchecked","varargs"})阻止这些警告.

·        try-with-resources声明 - try-with-resources 声明是一个try 声明,它定义了一个或多个资源. 一个资源是一个在使用完后必须关闭的对象.try-with-resources 声明确保每一个资源都会在声明结束后关闭. 任何实现 java.lang.AutoCloseable 接口或者 java.io.Closeable 接口的对象都可以作为一个资源. 类 java.io.InputStreamOutputStreamReaderWriterjava.sql.ConnectionStatement, 和ResultSet 已经改造成实现 AutoCloseable 接口,所以它们可以在 try-with-resources 声明中作为一个资源.

·        捕获多个异常类型和使用提升的类型检查重新抛出异常 –单个catch 块可以捕获多个类型的异常. 另外, 相比以前的版本,编译器在更早执行异常分析,这样就可以在方法定义中抛出更多指定的异常.

Java SE 6增强特性

Java SE 6没有语言特性的改变.

Java SE 5.0增强特性

·        泛型 – 这个期待已久的类型系统增强可以在编译期对对象的方法操作进行类型安全检查,集合框架增加了编译期类型安全检查,可以避免强制类型转换. 参考Java教程中的泛型 . (JSR 14)

·        循环增强 – 这个新的语言结构可以简化代码并减少出错的几率,在遍历集合或数组时可以不使用索引变量. (JSR 201)

·        自动包装/解包装 – 基本类型(例如int)和它对应的包装类型(例如Integer)不需要手动进行转换. (JSR 201)

·        类型安全枚举 – 这个灵活的面向对象的枚举类型可以创建包含任意字段和方法的枚举. 它提供了类型安全枚举模式 ("Effective Java," Item 21) 中提到的优势,并简化了代码和出错的几率. (JSR 201)

·        可变参数 – 当方法接受一个变长的参数时,这个特性允许我们免除将参数手动封装成数组.

·        静态导入 – 这个特性可以让你直接引用静态变量而不需要指定类名称,而且不会引入 "Constant Interfaceantipattern."中的缺点 (JSR 201)

·        注解 (元数据) –这个语言特性可以让你在某些场景下避免增加公式性的代码,通过使用一些工具,可以通过源代码中的注解产生公式性的代码. 这个特性导向了"声明式" 编程风格,你只要说明要做什么,相关工具就会去做什么. 同时,它减少了对某个源码文件相关文件的更新维护,你只需要维护这一个源码文件. (JSR 175)
注意: The @Deprecated 注解提供了将代码元素标记成过期的方式. 参考How and When To Deprecate APIs.

泛型相关的文档

·        JSR14: Adding Generic Types to the Java ProgrammingLanguage

·        Generics lesson in the Java Tutorials

·        Earlier public review draft specification from Java Community Process

·        Making the Future Safe for the Past:Adding Genericity to the Java Programming Language (PDF)
Bracha, Odersky, Stoutamire, and Wadler. OOPSLA 98, Vancouver, October 1998.( other formats)

·        GJ: Extending the Java ProgrammingLanguage with Type Parameters (PDF)
Bracha, Odersky, Stoutamire, and Wadler. A tutorial on GJ. August 1998. ( other formats)

·        Adding Generics to the Java ProgrammingLanguage (PDF)
Bracha. Slides from JavaOne 2003 presentation.

·        Adding Wildcards to the Java Programming Language (PDF)
Torgersen, Hansen, Ernst, Ahe, Bracha and Gafter. An ACM paper, 2004.

J2SE 1.4增强特性

·        断言功能 – 断言是一个布尔表达式,它用于程序员判断程序的计算结果.例如, 对一个list排序后,程序员可能需要判断这个list是否按升序排序. 断言会在运行期做出验证,这是提高代码质量的一个强大的工具, 它可以通过程序的行为快速的发现程序员犯下的错误.

 

原文地址:http://docs.oracle.com/javase/8/docs/technotes/guides/language/enhancements.html#javase8

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值