`
janeky
  • 浏览: 363953 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

JDK7新特性<二> 语法

    博客分类:
  • jdk7
阅读更多

 

       JDK7Java语法有少量更新,重点是在易用性和便捷性的改进。

 

1.二进制字面量

 

JDK7开始,终于可以用二进制来表示整数(byte,short,intlong)。使用二进制字面量的好处是,可以是代码更容被理解。语法非常简单,只要在二进制数值前面加 0b或者0B

 

       byte nByte = (byte)0b0001;
       short nShort = (short)0B0010;
       int nInt = 0b0011;
       long nLong = 0b0100L;

 

2.数字字面量可以出现下划线

 

对于一些比较大的数字,我们定义起来总是不方面,经常缺少或者增加位数。JDK7为我们提供了一种解决方案,下划线可以出现在数字字面量。

       int a = 10_0000_0000;
       long b = 0xffff_ffff_ffff_ffffl;
       byte c = 0b0001_1000;

        注意:你只能将下划线置于数字之间,以下使用方法是错误的,

 

1.数字的开头或者结尾

2.小数点的前后

3.‘F’或者‘f’的后缀

4.只能用数字的位置

       int err1 = _11,err2=11_;
       float err3=3._4,err4=3_.4;
       long err5=0x888_f;

 

3.switch 语句可以用字符串了

 

    这个功能千呼万唤,终于出来了

private static void switchString(String str){
        switch(str){
            case "one":
                System.err.println("1");
                break;
            case "two":
                System.out.println("2");
                break;
            default :
                System.out.println("err");
        }
}
 

4.泛型实例的创建可以通过类型推断来简化

 

    以后你创建一个泛型实例,不需要再详细说明类型,只需用<>,编译器会自动帮你匹配

//例如 
Map<String, List<String>> myMap = new HashMap<String, List<String>>();
//可以简化为
Map<String, List<String>> myMap = new HashMap<>();

 

5.在可变参数方法中传递非具体化参数(Non-Reifiable Formal Parameters),改进编译警告和错误

 

    有些参数类型,例如ArrayList<Number> List<String>,是非具体化的(non-reifiable.在编译阶段,编译器会擦除该类型信息。

      Heap pollution 指一个变量被指向另外一个不是相同类型的变量。例如

	List l = new ArrayList<Number>();
        List<String> ls = l;       // unchecked warning
        l.add(0, new Integer(42)); // another unchecked warning
        String s = ls.get(0);      // ClassCastException is thrown

      回到我们的主题,在jdk7中,当你定义下面的函数时

public static <T> void addToList (List<T> listArg, T... elements) {
    for (T x : elements) {
      listArg.add(x);
    }
  }

   你会得到一个warning

 

warning: [varargs] Possible heap pollution from parameterized vararg type 

 

    在jdk7之前,当你调用一个含有非具体化参数的可变参数方法,你必须自行保证不会发生“heap pollution”。这有一个问题,如果调用者对方法不熟悉,他根本无法判断。JDK7对此做了改进,在该方法被定义时久发出警告

 

要消除警告,可以有三种方式

1.加 annotation @SafeVarargs

2.加 annotation @SuppressWarnings({"unchecked", "varargs"})

3.使用编译器参数 –Xlint:varargs;

 

 

6.try-with-resources 语句

 

jdk7提供了try-with-resources,可以自动关闭相关的资源(只要该资源实现了AutoCloseable接口,jdk7为绝大部分资源对象都实现了这个接口)

 

static String readFirstLineFromFile(String path) throws IOException {
  try (BufferedReader br = new BufferedReader(new FileReader(path))) {
    return br.readLine();
  }
}

try 语句块中还可以同时处理多个资源,可以跟普通的try语句一样catch异常,有finally语句块

 

try (
      java.util.zip.ZipFile zf = new java.util.zip.ZipFile(zipFileName);
      java.io.BufferedWriter writer = java.nio.file.Files.newBufferedWriter(outputFilePath, charset)
    ) {
}catch(…){
}finally{
}
 

7.Catch多个Exception,rethrow exception 改进了类型检测

 

   

    很多时候,我们捕获了多个异常,却做了相同的事情,比如记日志,包装成新的异常,然后rethrow。这时,代码就不那么优雅了,例如

 

catch (IOException ex) {
     logger.log(ex);
     throw ex;
catch (SQLException ex) {
     logger.log(ex);
     throw ex;
}

 Jdk7允许捕获多个异常

 

catch (IOException|SQLException ex) {
    logger.log(ex);
    throw ex;
}

      注意,catch后面的异常参数是final的,不能重新再复制

 

 

      Rethrow Exception更具包容性的类型检测

 

    当你重新抛出多个异常时,不再需要详细定义异常类型了,编译器已经知道你具体抛出的是哪个异常了。你只需在方法定义的时候声明需要抛出的异常即可

 

public void call() throws ReflectiveOperationException, IOException {
    try {
      callWithReflection(arg);
    } catch (final Exception e) {
      logger.trace("Exception in reflection", e);
      throw e;
    }
}

 

     参考资料

    Jdk7官网 http://openjdk.java.net/projects/jdk7/

 

 

 

 

   (注:这篇文章发表时,JDK7未正式公布,可能有误差,具体以官方正式版为准)


     更多的jdk7文章,欢迎访问

http://janeky.iteye.com/category/157060

 

 

 

 

 

11
4
分享到:
评论
5 楼 xiegqooo 2013-08-07  
谢谢分享学习
4 楼 ylsn1982 2011-07-11  
使用二进制字面量的好处是,可以是代码更容易被理解。。。
3 楼 javabkb 2011-05-31  
另人期待的switch string
2 楼 janeky 2011-05-18  
soft_xiaohui 写道
  谢谢分享学习。

不客气!互相学习
1 楼 soft_xiaohui 2011-05-18  
  谢谢分享学习。

相关推荐

    JDK7新特性(完整篇)

    1.2 JDK7新特性&lt;二&gt; 语法 . . . . . . . . . . . . . 1.3 JDK7新特性&lt;三&gt; JDBC4.1 . . . . . . . . . . 1.4 JDK7新特性&lt;四&gt; NIO2.0 文件系统 . . . 1.5 JDK7新特性&lt;五&gt; fork/join 框架 . . . . . 1.6 JDK7新特性...

    AIC的Java课程1-6章

    第3版 机械工业出版社&lt;br&gt; 教学内容和要求&lt;br&gt;知识点 重要程度 使用频度 难度&lt;br&gt;Java 入门 高 中 易&lt;br&gt;变量和运算符 高 高 中&lt;br&gt;控制结构...br&gt;IO和串行化 高 中 难&lt;br&gt;知识点 重要程度 使用频度 难度&lt;br&gt;&lt;br&gt;第1章...

    JDK1.8【函数式接口】【定义与使用】【源码】

    提供型 Supplier&lt;T&gt; return:&lt;T&gt; * 3.函数型 Function&lt;T,R&gt; return:&lt;R&gt; * 4.断言型 Predicate&lt;T&gt; return:boolean * &lt;p&gt; * 参数使用形式 * 形式1:传递函数式接口对象 * 形式2:形参上直接写表达式

    GreenHatHG#blog_md#JDK8新特性之Lambda表达式的基本语法1

    简介官方文档:Lambda Expressions (The Java Tutorials &gt; Learning the Java Language &gt; Cla

    jdk 8.0最新版本-64位

    最新版jdk8.0,提供更多的支持 JDK8新增主要语法特性

    jdk8.0最新版本

    最新版jdk8.0,提供更多的支持 JDK8新增主要语法特性 函数接口(Functional Interface) 拉姆达(Lambda)表达式 方法引用(Method Reference) default方法(defender方法) 批量数据操作(bulk dataoperations)

    JDK8核心新特性

    为了让更多的Java从业者在学习新特性的时候少走弯路并快速掌握新特性的使用,本课程将详细讲解Lambda表达式,Stream以及方法引用等非常核心的新特性,相信学完该课程你可以在开发中灵活运行这些新特性语法编写出效率...

    动力节点_Java基础视频教程170_JDK7新特性

    动力节点的Java课程适合绝对零基础的观看,教程中讲解了Java开发环境搭建、Java的基础语法、Java的面向对象。每一个知识点都讲解的非常细腻,由浅入深。适合非计算机专业,想转行做Java开发的朋友,或者想让Java基础...

    Java系列JDK 1.8 新特性之 Lambda表达式.pdf

    语法格式二:lambda有一个参数、无返回值 ​语法格式三:Lambda只有一个参数时,可以省略() 语法格式四:Lambda有两个参数时,并且有返回值 语法格式五:当Lambda体只有一条语句的时候,return和{}可以省略掉 语法...

    JDK.rar_jdk1.7

    JDK1.7新特性介绍 涵盖了大多数JDK最新语法及详细说明

    jdk1.8.0版本安装包

    版本的不断更新、升级,无非是对bug的修复、新功能的增加、优化等,在JDK版本中,JDK1.8变得备受关注,也成了各大公司面试中常常被问及的话题。 一、JDK1.8优点概括 1、速度更快 由于底层结构和JVM的改变,使得JDK...

    jdk-13.0.1_windows-x64_bin.exe

    switch 表达式扩展了 switch 语句,使其不仅可以作为语句(statement),还可以作为表达式(expression),并且两种写法都可以使用传统的 switch 语法,或者使用简化的“case L -&gt;”模式匹配语法作用于不同范围并...

    day022-jdk8新特性和lambda表达式 代码和笔记.rar

    语法: 函数式接口 变量名 = (参数1,参数2...) -&gt; { //方法体 } (参数1,参数2…)表示参数列表; -&gt;表示连接符;连接符号后是方法体 {}内部是方法体 特点说明: 普通方法的写法 ...

    mac os jdk8

    新特性 Java8 新增了非常多的特性,我们主要讨论以下几个: Lambda 表达式 − Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中。 方法引用 − 方法引用提供了非常有用的语法,可以直接引用已有Java类...

    动力节点_Java基础视频教程171_JDK8新特性

    动力节点的Java课程适合绝对零基础的观看,教程中讲解了Java开发环境搭建、Java的基础语法、Java的面向对象。每一个知识点都讲解的非常细腻,由浅入深。适合非计算机专业,想转行做Java开发的朋友,或者想让Java基础...

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

     《Java JDK 7学习笔记》针对Java SE 7新功能全面改版,无论是章节架构或范例程序代码,都做了全面重新编写与翻新。  《Java JDK 7学习笔记》是作者多年来教学实践的经验总结,汇集了学员在教学过程中遇到的概念、...

    jdk8.0版本

    jdk8.0,提供更多的支持 JDK8新增主要语法特性 函数接口(Functional Interface) 拉姆达(Lambda)表达式 方法引用(Method Reference) default方法(defender方法) 批量数据操作(bulk dataoperations)

    DWR.xml配置文件说明书(含源码)

    DWR有个专门用于解析上面配置语句的解析器,虽然上面的是JDK5中才有的特性,因为有解析器的原因这也可以应用与JDK5之前的版本. 解析规则是不可见的,但有两种例外情况. 一种情况是因为DWR1.0的解析器中有个Bug,在有些...

    jdk-14_linux-x64_bin.rpm

    switch 表达式扩展了 switch 语句,使其不仅可以作为语句(statement),还可以作为表达式(expression),并且两种写法都可以使用传统的 switch 语法,或者使用简化的“case L -&gt;”模式匹配语法作用于不同范围并...

    《Java 核心技术 卷I 》第12版,涵盖Java17新特性(英文版)

    Java核心技术I英文版,涵盖jdk17最新特性 伴随着Java的成长,《Java核心技术》从第1版到第11版一路走来,得到了广大Java程序设计人员的青睐,成为一本畅销不衰的Java经典图书。 本书经全面修订,以涵盖Java 17的新...

Global site tag (gtag.js) - Google Analytics