在学习版本增强的时候,各种博文众说纷纭,我看得眼花缭乱。为了学习最权威的知识,我还是查看了java的官方手册。
Java 5的增强特性:
1. 泛型:这种期待已久的类型系统增强允许类型或方法对各种类型的对象进行操作,同时提供编译时类型安全性。 它为集合框架增加了编译时类型安全性且消除了具体对象使用时的复杂性。
2. for循环的增强:这种新的语言结构消除了迭代集合和数组时迭代器和索引变量的苦差事和错误倾向。
3. 自动装箱/拆箱:此工具消除了原始类型(如int)和包装器类型(如Integer)之间手动转换的苦差事。
4. 枚举类型安全:这种灵活的面向对象的枚举类型工具允许您使用任意方法和字段创建枚举类型。 它提供了Typesafe Enum模式的所有优点,没有冗长和错误倾向。
5. 可变参数:在调用接受可变长度参数列表的方法时,此工具无需手动将参数列表装入数组。
6. 静态导入:此工具允许您避免使用类名限定静态成员,而不存在“常量接口反模式”的缺点。
7. 注解:此语言功能允许您通过启用工具从源代码中的注释生成样板代码来避免在许多情况下编写样板代码。 这导致了一种“声明式”编程风格,程序员说应该做什么,工具会发出代码来执行它。 此外,它消除了维护“side files”的需要,这些文件必须与源文件中的更改保持同步。 而是可以在源文件中维护信息。
Java 6的增强特性:
没有语言的修改。
Java 7的增强特性:
1. 二进制字面值:在Java SE 7中,也可以使用二进制数系统表示整数类型(byte,short,int和long)。 要指定二进制文字,请在数字中添加前缀0b或0B。
2. 数字文字中的下划线:任何数量的下划线字符(_)都可以出现在数字文字中的数字之间的任何位置。 例如,此功能使您可以分隔数字文字中的数字组,这可以提高代码的可读性。
3. switch语句中的字符串:可以在switch语句的表达式中使用String类。
4. 通用实例创建的类型推断:只要编译器可以从上下文中推断出类型参数,就可以用一组空的类型参数(<>)替换调用泛型类的构造函数所需的类型参数。 这对尖括号被非正式地称为diamond.。
5. 改进了在可变参数方法中使用不可重写的形参时的编译器警告和错误:Java SE 7编译器在varargs方法或构造函数的声明站点处生成警告,其中包含不可重新生成的varargs形式参数。 Java SE 7引入了编译器选项-Xlint:varargs和注释@SafeVarargs和@SuppressWarnings({“unchecked”,“varargs”})来抑制这些警告。
6. try-with-resources声明:try-with-resources语句是一个声明一个或多个资源的try语句。 资源是在程序完成后必须关闭的对象。 try-with-resources语句确保在语句结束时关闭每个资源。 实现新的java.lang.AutoCloseable接口或java.io.Closeable接口的任何对象都可以用作资源。 已经对类java.io.InputStream,OutputStream,Reader,Writer,java.sql.Connection,Statement和ResultSet进行了改进以实现AutoCloseable接口,并且所有这些类都可以在try-with-resources语句中用作资源。
7. 通过改进的类型检查捕获多个异常类型并重新引发异常:单个catch块可以处理多种类型的异常。 此外,与早期版本的Java SE相比,编译器可以更准确地分析重新抛出的异常。 这使您可以在方法声明的throws子句中指定更具体的异常类型。
Java 8的增强特性:
1. Lambda表达式:使您能够封装单个行为单位并将其传递给其他代码。 如果希望对集合的每个元素执行某个操作,进程完成时或进程遇到错误,则可以使用lambda表达式。 Lambda表达式由以下功能支持:
1) 对于已经有名称的方法,方法引用是紧凑的、易于读取的lambda表达式。
2) 默认方法允许您向库的接口添加新功能,并确保与为这些接口的旧版本编写的代码的二进制兼容性。它们是接口方法,在方法签名的开头有一个实现和默认关键字。此外,还可以在接口中定义静态方法。
3) 在Java SE 8中利用lambda表达式和流的新的和增强的API描述了利用lambda表达式和流的新的和增强的类。
2. 改进了类型推断:Java编译器利用目标类型来推断泛型方法调用的类型参数。 表达式的目标类型是Java编译器所期望的数据类型,具体取决于表达式的显示位置。 例如,您可以在Java SE 7中使用赋值语句的目标类型进行类型推断。但是,在Java SE 8中,您可以在更多上下文中使用目标类型进行类型推断。 最突出的示例是使用方法调用的目标类型来推断其参数的数据类型。
3. Java类型的标注:现在可以在使用类型的任何地方应用注释。 与可插拔类型系统结合使用,可以对代码进行更强大的类型检查。
4. 重复注解:现在可以将同一批注类型多次应用于同一声明或类型使用。
5. 反射的方法参数:可以使用方法java.lang.reflect.Executable.getParameters获取任何方法或构造函数的形式参数的名称。 (Method和Constructor类扩展了类Executable,因此继承了Executable.getParameters方法。)但是,.class文件默认不存储形式参数名。 要将正式参数名称存储在特定.class文件中,从而使Reflection API能够检索形式参数名称,请使用javac编译器的-parameters选项编译源文件。