java7新特性转载_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > java7新特性转载

java7新特性转载

 2015/2/1 18:30:32  heqiusong  程序员俱乐部  我要评论(0)
  • 摘要:1.二进制形式的字面值表示在JavaSE7中新增了以二进制形式的字面值表示方式,你可以像使用十进制一样,方便地使用二进制形式的字面值来表示数值。例如://一个8位的byte值:byteaByte=0b100001;//一个16位的short值:shortaShort=0b1010010100101;//一个32位的int值:intanInt1=0b101000010100010110100101000101;//一个64位的long值(注意末尾的后缀「L」
  • 标签:新特性 Java
1.二进制形式的字面值表示
在Java SE 7中新增了以二进制形式的字面值表示方式,你可以像使用十进制一样,方便地使用二进制形式的字面值来表示数值。
例如:
// 一个8位的byte值:
byte aByte = 0b100001;
// 一个16位的short值:
short aShort = 0b1010010100101;
// 一个32位的int值:
int anInt1 = 0b101000010100010110100101000101;
// 一个64位的long值(注意末尾的后缀「L」)
long aLong = 0b101000010L;
// 二进制字面值以0b或0B开头,不区分大小写
int anInt2 = 0B101;
2.在数值类型的字面值中使用下划线分隔符联接-------提高可读性
在Java SE 7中,还支持以下划线作为分隔符联接的数值表示方式:

//十进制形式
int anInt1 = 12_235
//二进制、十六进制等形式也支持
int anInt2 = 0b10_0110_100;
int anInt3 = 0xFF_EC_DE_5E;
//小数形式也支持
float pi = 3.14_15F;
double aDouble = 3.14_15;

不过以下几种书写形式是错误的:

//下划线不能放在最后
int x = 52_;                //错误
//下划线不能邻近小数点(邻近小数点前后都不行)
float pi1 = 3_.1415F;       // 错误
float pi2 = 3._1415F;       //错误
//下划线不能紧放在后缀「L」或「F」的前面
float pi3 = 3.1415_F;       //错误
long aLong1 = 999_99_9999_L;//错误
//下划线不能放在表示进制的前缀字符之间
int x5 = 0_x52;             //错误
此外,还要注意下面这种,将下划线放在最前面的情况:

//在Java中,变量名称不能以数字开头,但可以下划线开头。所以,这里的_52并不是一个数字的字面值形式,而是一个变量标识符(变量名)
int _52 = 120;  
int x = _52;     
3.创建泛型实例时自动类型推断
在以前的版本中使用泛型类型,需要在声明并赋值的时候,两侧都加上泛型类型。例如:

Map<String, String> myMap = new HashMap<String, String>();
不过,在Java SE 7中,这种方式得以改进,现在你可以使用如下语句进行声明并赋值:

Map<String, String> myMap = new HashMap<>();    //注意后面的"<>"
在这条语句中,编译器会根据变量声明时的泛型类型自动推断出实例化HashMap时的泛型类型。再次提醒一定要注意new HashMap后面的「<>」,只有加上这个「<>」才表示是自动类型推断,否则就是非泛型类型的HashMap,并且在使用编译器编译源代码时会给出一个警告提示。
注意:Java SE 7在创建泛型实例时的类型推断是有限制的,你只能在联系上下文可以明确确定参数化类型的时候使用泛型推断。例如:下面的例子无法正确编译:

List<String> list = new ArrayList<>();
list.add("A");
// 由于addAll期望获得Collection<? extends String>类型的参数,因此下面的语句无法通过
list.addAll(new ArrayList<>());
与上面的例子相比,下面的这个例子可以通过编译:
List<String> list = new ArrayList<>();
list.add("A");
List<? extends String> list2 = new ArrayList<>();
list.addAll(list2);
注:java5泛型的一些解释
类型参数?是无约束的或无限制的类型。有时在还没有完全指定类型参数时,需要对类型参数指定附加的约束。
考虑例子Matrix类,它使用类型参数?,该参数由Number类来限制:
public class Matrix<? extends Number> { ... }
4.switch-case语句支持字符串类型
String input = "Monday";
String output = null;
switch(input){
case "Monday":
    output = "星期一";
    break;
case "Tuesday":
    output = "星期二";
    break;
case "Wednesday":
    output = "星期三";
    break;
case "Thursday":
    output = "星期四";
    break;
case "Friday":
    output = "星期五";
    break;
case "Saturday":
    output = "星期六";
    break;
case "Sunday":
    output = "星期日";
    break;
default:
    throw new IllegalArgumentException("无效的输入参数:" + input);
}
System.out.println(output); //输出:星期一

5.新增try-with-resources语句
try-with-resources语句是一个声明一个或多个资源的 try 语句。一个资源作为一个对象,必须在程序结束之后随之关闭。 try-with-resources语句确保在语句的最后每个资源都被关闭 。任何实现了 java.lang.AutoCloseable的对象, 包括所有实现了 java.io.Closeable 的对象, 都可以用作一个资源。
       下面的例子读取文件的第一行。它使用了 BufferedReader 的一个实例来读取文件中的数据。BufferedReader 是一个资源,它必须在程序结束之后随之关闭:
    static String readFirstLineFromFile(String path) throws IOException {
      try (BufferedReader br = new BufferedReader(new FileReader(path))) {
        return br.readLine();
      }
    }
       在这个例子中, try-with-resources 语句声明的资源是一个 BufferedReader。声明语句在紧跟在 try 关键字的括号里面。Java SE 7以及后续版本中,BufferedReader类实现了java.lang.AutoCloseable接口。 因为 BufferedReader 实例是在 try-with-resource 语句中声明的, 所以不管 try 语句正常地完成或是 发生意外 (结果就是 BufferedReader.readLine 方法抛出IOException),BufferedReader都将会关闭。
       在 Java SE 7之前, 可以使用 finally 块来确保资源被关闭,不管 try 语句正常地完成或是发生意外。下面的例子使用 finally 块替换 try-with-resources 语句:
    static String readFirstLineFromFileWithFinallyBlock(String path) throws IOException {
      BufferedReader br = new BufferedReader(new FileReader(path));
      try {
        return br.readLine();
      } finally {
        if (br != null) br.close();
      }
    }
       然而,在这个例子中,如果 readLine 和 close 方法均抛出异常,那么 readFirstLineFromFileWithFinallyBlock 方法将抛出从 finally 块中抛出的异常;  try 块中抛出的异常被抑制了。与此相反, 在 readFirstLineFromFile 这个例子中, 如果 try 块和 try-with-resources 语句均抛出异常, 那么 readFirstLineFromFile 将抛出从 try 块中抛出的异常;  try-with-resources 块抛出的异常被抑制了。在Java SE 7 以及后续的版本中, 你可以检索被抑制的异常;详情参见 Suppressed Exceptions。
       可以在一个 try-with-resources 语句中声明一个或多个资源。下面的例子检索zip文件 zipFileName 中所有文件的名称并创建一个包含那些文件名称的文本文件:
    public static void writeToFileZipFileContents(String zipFileName, String outputFileName)
      throws java.io.IOException {

      java.nio.charset.Charset charset = java.nio.charset.Charset.forName("US-ASCII");
      java.nio.file.Path outputFilePath = java.nio.file.Paths.get(outputFileName);

      // Open zip file and create output file with try-with-resources statement

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

        // Enumerate each entry

        for (java.util.Enumeration entries = zf.entries(); entries.hasMoreElements();) {

          // Get the entry name and write it to the output file

          String newLine = System.getProperty("line.separator");
          String zipEntryName = ((java.util.zip.ZipEntry)entries.nextElement()).getName() + newLine;
          writer.write(zipEntryName, 0, zipEntryName.length());
        }
      }
    }
       在这个例子中, try-with-resources 语句包含两个由分号隔开的声明: ZipFile 和 BufferedWriter。当代码块直接伴随着它正常地或由于一个异常终止时, BufferedWriter 和 ZipFile 对象的 close 方法以这种顺序自动地调用 。注意:资源的 close 方法调用顺序与它们的创建顺序相反。
       下面的例子使用一个 try-with-resources 语句来自动关闭一个 java.sql.Statement 对象:
    public static void viewTable(Connection con) throws SQLException {

      String query = "select COF_NAME, SUP_ID, PRICE, SALES, TOTAL from COFFEES";

      try (Statement stmt = con.createStatement()) {

        ResultSet rs = stmt.executeQuery(query);

        while (rs.next()) {
          String coffeeName = rs.getString("COF_NAME");
          int supplierID = rs.getInt("SUP_ID");
          float price = rs.getFloat("PRICE");
          int sales = rs.getInt("SALES");
          int total = rs.getInt("TOTAL");
          System.out.println(coffeeName + ", " + supplierID + ", " + price +
                           ", " + sales + ", " + total);
        }

      } catch (SQLException e) {
        JDBCTutorialUtilities.printSQLException(e);
      }
    }
       这个例子中使用的 java.sql.Statement 这个资源是JDBC 4.1以及后续版本API的一部分。
       注意: 一个 try-with-resources 语句可以像普通的 try 语句那样有 catch 和 finally 块。在try-with-resources 语句中, 任意的 catch 或者 finally 块都是在声明的资源被关闭以后才运行。
被抑制的异常
       与 try-with-resources 语句关联的代码块可能会抛出异常。在 writeToFileZipFileContents这个例子中,  当试图关闭 ZipFile 和 BufferedWriter 对象时,try 块可能会抛出一个异常,并且 try-with-resources 语句可能抛出多达两个异常 。如果 try 块抛出异常并且 try-with-resources 语句抛出一个或多个异常,那么从 try-with-resources 语句中抛出的异常将会被抑制, 并且块抛出的异常是由 writeToFileZipFileContents 方法抛出的那一个。你可以通过调用由 try块抛出的异常的Throwable.getSuppressed 方法检索这些被抑制的异常信息。
实现了AutoCloseable 或 Closeable 接口的类
       参见 AutoCloseable 和 Closeable 接口的Javadoc可以看到实现了两者当中的任何一个接口的类集。Closeable 接口继承了 AutoCloseable 接口。 Closeable接口的 close 方法抛出IOException 类型的异常而 AutoCloseable 接口的 close 方法抛出 Exception 类型的异常。因此, subclasses of the AutoCloseable 接口的子类可以重写 close 方法的这个行为来抛出指定的异常,例如 IOException, 或者没有异常。
6.单个catch子句同时捕获多种异常类型
//多个异常类型之间用"|"隔开
catch (IOException|SQLException ex) {
    logger.log(ex);
    throw ex;
}
注意:如果一个catch语句块处理的异常类型超过1个,那就隐式地表示被catch的参数变量(例如上面的ex)是一个final的变量,你不能在catch语句块内对其重新赋值。
发表评论
用户名: 匿名