站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题J2SE 1.5新特性

J2SE 1.5新特性

摘要: J2SE 1.5新特性

J2SE 1.5新特性

部分典型变化:

1.自动包装和解包(Autoboxing and unboxing)
  代码示例
  往一个ArrayList中加入一个整数,1.5版本以前的版本写法是:
  List list = new ArrayList();
  list.add(new Integer(1));
  而在1.5版本中可以写为:
  list.add(1);
因为,在1.5版本中,对一个整数进行包装,使之成为一个Integer对象(即包装,boxing),然后加入
到一个ArrayList中的做法被认为是没有必要的,反之,解包(unboxing)的做法也是没有必要的,这样
的代码只是增加了程序的文本长度而已,所以1.5版本支持了自动包装和解包操作,对于bool/Boolean,
byte/Byte,double/Double,short/Short,int/Integer,long/Long,float/Float的相应包装/解包
操作都进行了支持,从而使代码变得简单。

  2.更优化的循环语句(The inhanced for loop)
  代码示例
  一个典型的遍历数组的循环语句,1.5版本以前的写法是:
  for (Iterator iterator = list.iterator(); iterator.hasNext();) {
   Integer n = (Integer)iterator.next();
   ...
  }
  而在1.5版本中可以写为:
  for (Integer n : list) {
   ...
  }
显然1.5版本的写法比以前是大大简化了,但是在需要修改集合,比如删除其中元素时不能采用这种写法。

3.参数可变的方法
  代码示例
  当不能确定一个方法的入口参数的个数时,以往版本的Java中,通常的做法是将多个参数放在一个数组
或者对象集合中作为参数来传递,1.5版本以前的写法是:
  int sum(Integer[] numbers) {
    int nSum = 0;
    for (int i: numbers)
   nSum += i;
   return nSum;
  }
  //在别处调用该方法
  sum(new Integer[] {12,13,20});
  而在1.5版本中可以写为:
  int sum(Integer... numbers) {
   int nSum = 0;
   for (int i: numbers)
   nSum += i;
   return nSum;
  }
  //在别处调用该方法
  sum(12,13,20);
显然,1.5版本的写法更为简易,也更为直观,尤其是方法的调用语句,不仅简化很多,而且更符合通常的思维
方式,更易于理解。

  4.C风格的格式化输出方法——printf
  代码示例
  输出一个加法算式,1.5版本以前的写法是:
  int x = 5;
  int y = 7;
  int nSum = x + y;
  System.out.println(x + " + " + y + " = " + nSum);
  而在1.5版本中可以写为:
  System.out.printf("%d + %d = %d\n", x, y, nSum);
  以上两种写法的输出结构是一样的,即“5 + 7 = 12”。
  这种改变不仅仅是形式上的,printf还可以提供更为灵活、强大的输出功能,比如限定按照两位整数的形式
输出,可以写为“System.out.printf("%02d + %02d = %02d\n", x, y, nSum);”,输出结果将是“05 + 07 = 12”。

  5.枚举
  代码示例
  构建一个表示色彩的枚举,并赋值,在1.5版本中可以写为:
  public enum MyColor{Red, Yellow, Blue}
  MyColor color = MyColor.Red;
  for (MyColor mycolor : MyColor.values())
    System.out.println(mycolor);
  以往的Java版本中没有enum关键词,1.5版本中终于加入了进来,这确实是一个令人高兴的改进。此外,
enum还提供了一个名为values()的静态方法,用以返回枚举的所有值的集合。所以,以上程序的输出结果是把
“Red”、“Yellow”、“Blue”分行输出。
  而enum提供的静态方法valueOf()则将以字符串的形式返回某一个具体枚举元素的值,比如
“MyColor.valueOf(“Red”)”会返回“Color.Red”。静态方法name()则返回某一个具体枚举元素的名字,
比如“MyColor.Red.name()”会返回“Red”。类似的方法还有不少。此外,enum自身还可以有构造方法。

  6.静态引用
  代码示例
  当我们要获取一个随即数时,1.5版本以前的写法是:
  import java.lang.Math; //程序开头处
  ...
  double x = Math.random();
  而在1.5版本中可以写为:
  import static java.lang.Math.random; //程序开头处
  …
  double x = random();
  静态引用使我们可以象调用本地方法一样调用一个引入的方法,当我们需要引入同一个类的多个方法时,
只需写为“import static java.lang.Math.*”即可。这样的引用方式对于枚举也同样有效。

1.5版本的Java确实给我们带来了很多令人激动的变革,如同以上介绍的那样,很多功能以前的版本也能
实现,但是不能实现得这样简单、漂亮。相信这次变革会给Java带来更多的追随者。

注:1.4版本增加了assert关键词

断言(assert)是一个包含布尔表达式的语句,在执行这个语句时假定该表达式为 true。如果表达式计算为 false,那么系统会报告一个 AssertionError。它用于调试目的:
assert(a > 0); //throws an AssertionError if a <= 0
断言可以有两种形式:
assert Expression1;
assert Expression1 : Expression2;
Expression1 应该总是产生一个布尔值。
Expression2 可以是得出一个值的任意表达式。这个值用于生成显示更多调试信息的 String 消息。
断言在默认情况下是禁用的。要在编译时启用断言,需要使用 source 1.4 标记:
javac -source 1.4 Test.java
要在运行时启用断言,可使用 -enableassertions 或者 -ea 标记。
要在运行时选择禁用断言,可使用 -da 或者 -disableassertions 标记。
要系统类中启用断言,可使用 -esa 或者 -dsa 标记。还可以在包的基础上启用或者禁用断言。
可以在预计正常情况下不会到达的任何位置上放置断言。断言可以用于验证传递给私有方法的参数。不过,断言不应该用于验证传递给公有方法的参数,因为不管是否启用了断言,公有方法都必须检查其参数。不过,既可以在公有方法中,也可以在非公有方法中利用断言测试后置条件。另外,断言不应该以任何方式改变程序的状态。




↑返回目录
前一篇: J2SE5.0新特性之使用代理服务器
后一篇: J2SE5.0新特性之windows下读取网卡的物理地址