Java7新特性

① 新增了switch对字符串的支持,也就是说可以在switch之后直接使用字符串来进行判断,语法基本与Java7之前支持的语法一样。
② 对数值字面量的增强支持,首先是可以在源代码中直接使用二进制数据,但是需要在二进制之前加上“0b”或“0B”来表示,其次是在数值字面量中使用下划线,主要是为了便于阅读,但是在数字之前和之后是不允许的,比如“123_”或“_123”,换句话说,下划线只能出现在数字中间,否则无法通过编译。
③ 支持在一个catch子句中同时捕获多个异常,另外是在捕获并重新抛出异常时的异常类型变得更加精确。
            try{
int j = 4/0;
}catch(ArithmeticException | NullPointerException e){
}finally{
System.out.println("没有任何问题");
}
每个异常类型之间使用“|”来分隔,但是注意的是,在catch子句中声明捕获的这些异常类中,不能出现重复的类型,也不允许其中的某个异常是另外一个异常的子类,否则会出现如下的编译错误:“  错误: multi-catch 语句中的替代无法通过子类化关联”。如果在catch子句中声明了多个异常类,那么异常参数的具体类型是所有这些异常类型的最小上界。
④ try-with-resources语句的使用,java7对try语句进行了增强,使它可以支持对资源的自动回收管理,保证资源总是被正确的释放。注意:能够被try语句所管理的资源需要满足一个条件,就是Java类要实现java.lang.AutoCloseable接口,否则会出现编译错误,当需要释放资源的时候,该接口的close方法会被自动调用。
⑤ Java7中引入了一个新的注解,@SafeVarargs,意思是,如果开发人员确信某个使用了可变长度参数的方法,在与泛型类一起使用时不会出现类型安全问题,就可以用这个注解进行声明。在使用了这个注解之后,编译器遇到类似的情况,就不会再给出相关的警告信息。@SafeVarargs注解只能用在参数长度可变的方法或构造方法上,且方法必须声明为static或final,否则会出现编译错误。一个方法使用@SafeVarargs注解的前提是,开发人员必须确保这个方法的实现中对泛型类型参数的处理不会引发类型安全问题。
⑥ 脚本引擎介绍:一段脚本的执行需要由该脚本语言对应的脚本引擎来完成。一个Java程序可以选择同时包含多脚本语言的执行引擎,这完全由程序的需求决定。程序中所用到的脚本语言,都需要有相应的脚本引擎。脚本引擎管理器共支持三种查找脚本引擎的方式,分别通过名称、文件扩展名和MIME类型来完成。
语言绑定:语言绑定对象就是一个简单的哈希表,用来存放和获取需要共享的数据,所有数据都对应这个哈希表中的一个条目,是简单的名值对。
脚本的编译:脚本语言一般是解释执行的,脚本引擎在运行时需要先解析脚本之后再执行。一般来说,通过解释执行的方法来运行脚本的速度比编译之后再运行会慢一些。当一段脚本需要多次重复执行时,可以先对脚本进行编译。编译之后的脚本在执行时不需要重复解析,可以提高执行效率。不是所有的脚本引擎都支持对脚本进行编译。如果脚本引擎支持这一特性,它会实现javax.script.Compilable接口来声明这一点。脚本引擎的使用者可以利用这个能力来提高需要多次执行的脚本的运行效率。Java SE中自带的JavaScript脚本引擎是支持对脚本进行 编译的。
⑦ 对于构造方法声明了长度可变的参数,在获取构造方法的时候,要使用对应的数组类型的class对象。这是因为长度可变的参数实际上是通过数组来实现的。对于静态的内部类调用并没有特别之处,按照一般的方式来使用即可。而对于非静态的内部类来说,其特殊之处在于它的对象实例中都有一个隐含的对象引用,指向包含它的外部类对象。也正是这个隐含的对象引用的存在,使非静态内部类中的代码可以直接引用外部类中包含的私有域和方法。因此,在获取非静态内部类的构造方法的时候,类型参数列表的第一个值必须是外部类的Class对象。
值得一提的是:Java7为所有的与反射操作相关的异常类添加了一个新的父类java.lang.ReflectiveOperationException。在处理与反射相关的异常的时候,可以直接捕获这个新的异常。而在Java7之前,这些异常需要单独捕获。
⑧ 方法句柄是对Java中方法、构造方法和域的一个强类型的可执行引用。通过方法句柄可以直接调用该句柄所引用的底层方法。对于一个方法句柄来说,它的类型完全由它的参数类型和返回值类型来确定,而与它所引用的底层方法的名称和所在的类没有关系。方法句柄是由java.lang.invoke.MethodHandle类来表示的。在得到一个方法句柄之后,可以通过其type方法来查看其类型。该方法的返回值是一个java.lang.invoke.MethodType类的对象。MethodType类的所有对象实例都是不可变的,类似于String类。所有对MethodType类对象的修改都会产生一个新的MethodType对象。两个MethodType对象是否相等,取决于它们所包含的参数类型和返回值类型是否完全一致。
原文地址:https://www.cnblogs.com/jiangu66/p/3174539.html