猛虎出山 —— Java 5.0的新语言特性

转载 2007年09月15日 10:47:00

2004年下半年,Sun公司发布了开发代号为“Tiger”的J2SE 5.0,揭开了Java发展的一个重要里程碑。在过去的Java升级中更多的是进行一些库函数的改进,而这次则直接从语法层面上进行了增强。直接从1.4跳到5.0Sun本来是打算用1.5.0这个版本号的),单从版本号的变化上就可以看出这次升级的力度是如此之大。那么,到底有些什么改变呢?下面就请随我窥视一二(其中所举的代码例子均摘自于《J2SE 5.0 in a Nutshell》):

 

范型(Generics

在以前,我们需要为不同的数据类型分别建立相对应的方法、类或接口,例如一个加法方法add可能需要分别定义int add(int a, int b)String add(String a, String b)MyClass add(MyClass a, MyClass b)等多个方法,即便这些方法中的处理逻辑完全相同(只是数据类型不同)也是这样。

C++中的模板(template) 一样,范型使程序员能创建通用的方法、类和接口,这种情况下他们所操作数据的类型是通过参数指定的。通过使用范型,使得只创建一个类就能自动工作于不同数 据类型。因此,范型扩展了程序员复用代码的能力。另外,范型也增加了类型安全。使用范型以后,我们不再需要显式的强制转换(cast),这样能在编译时就发现类型不符,避免到运行时出现类型转换错误。

下面是使用范型前后的代码对比:

使用范型前:

ArrayList list = new ArrayList();

list.add(0, new Integer(42));

int total = ((Integer)list.get(0)).intValue();

使用范型后(下面还有进一步利用自动装箱/拆箱特性以后更简洁的代码):

ArrayList<Integer> list =  new ArrayList<Integer>();

list.add(0, new Integer(42));

int total = list.get(0).intValue();

顺便提到一点,非常遗憾,运算符重载没有能够跟范型一起被加入进来。如果Java能够支持运算符重载的话,在使用范型的时候感觉就更好了(不过,那样Java就越来越像C++了)。

 

元数据(Metadata

新的元数据工具更多是为未来考虑而增加的,它让你能够在程序中嵌入注解(annotation),这些注解能够被不同的编程工具处理。例如,工具可以根据注解(annotation)的要求生成Java源代码,这样只要程序员指定一种动作,然后就可以将实际提供代码的事情留给工具了,从而大大降低了程序员必须手工输入的重复代码的数量。

下面是使用元数据前后的代码对比:

使用前:

public interface PingIF extends Remote {

      public void ping() throws RemoteException;

}

public class Ping implements PingIF {

     public void ping() {

          ……

     }

}

使用后:

public class Ping {

     public @remote void ping() {

          ……

     }

}

 

自动装箱(Autoboxing和自动拆箱(Auto-Unboxing

Java诞生以来,简单数据类型(intlongfloat等)和其对应的包装类型(IntegerLongFloat等)之间一直不能自动转换,这为我们带来了很多麻烦。现在Java终于添加了自动装箱(Autoboxing)和自动拆箱(Auto-unboxing),为我们解决了这个问题。自动装箱(Autoboxing)特性让Java自动包装一个简单数据类型(例如int)到对应的包装类型中(例如Integer)中。自动拆箱(Auto-unboxing)是相反的过程,即将一个包装类型(例如Integer)自动转换为它所对应的简单数据类型(例如int)。举例如下:

以前:

ArrayList<Integer> list = new ArrayList<Integer>();

list.add(0, new Integer(42));

int total = (list.get(0)).intValue();

以后(请对照范型部分使用范型前的例子代码):

ArrayList<Integer> list = new ArrayList<Integer>();

list.add(0, 42);

int total = list.get(0);

 

枚举(Enumeration

很多编程语言中都是有枚举类型,而在Java诞生的时候, Java的创造者没有把这个东东包含Java中来,这导致我们在程序中写了许多public static final。现在枚举终于被加入到Java中来了。

本质上,一个枚举是一个命名常量的列表。枚举类型通过新的关键字enum来支持。下面是定义一个枚举的例子代码:

public enum StopLight { red, amber, green };

再顺便提到一点,非常遗憾,常量没有能够跟范型一起被加入进来,这意味着使用public static final的命运还没有终结。

 

增强的for循环

Java 5.0中添加了“for-each”形式的循环。这个增强为大量集合、数组等的循环处理提供了便利,并为我们防止数组越界提供有益的帮助,还避免了原来必需的强制类型转换(case),让我们能在编译时就发现类型不符,避免到运行时出现类型转换错误。。

下面是在使用新的for循环前后的代码对比:

使用前:

ArrayList<Integer> list = new ArrayList<Integer>();

for (Iterator i = list.iterator(); i.hasNext();) {

         Integer value=(Integer)i.next();

              ……

}

使用后:

ArrayList<Integer> list = new ArrayList<Integer>();

for (Integer i : list) {

       ……

}

 

不定参数(Varargs

在实际开发过程中,有时候会遇到方法参数不固定的情况。在过去,为了解决问题,我们经常采用将参数包装到一个数组或者集合中的方式。现在有Varargs帮助我们解决这个问题了。Varargs让一个方法可以带有可变数目参数。Varargs的加入使得创建带有可变数目参数的方法变的更加容易。下面是使用不定参数的例子:

// 方法定义

void argtest(Object ... args) {

      for (int i=0;i <args.length; i++) {

      }

}

// 调用方式

argtest("test", "data");

 

静态导入(Static Import

过去使用静态成员通常我们需要进行这种形式的调用:YourClassName.staticMember,在每次使用静态成员的时候我们都要把这个静态成员所属类的名字写一遍。现在静态导入可以让我们不必每次都去写类的名字了,可以直接通过静态成员的名字来访问它们。下面是使用静态导入的例子:

// 静态导入

import static java.awt.BorderLayout.*;

// 调用静态成员

getContentPane().add(new JPanel(), CENTER);

 

其它改变

       上面所列的主要是一些Java 5在语言层面的升级,Java 5在基础类库、用户界面、虚拟机、执行效率等其它方面也进行了大量的升级。例如在基础类库方面,为范型的出现更新了集合框架,为方便多线程开发对线程同步进行了改进,为方便输入输出增加了新的FormatterScanner 类。

对于这些方面我在这里就不再列举了,如果需要你可以查找相应的文档进行学习。

 

相关文章推荐

Java5.0专题 之 语言特性(转载)

J2SE 5.0专题 之 语言特性(转载)                          本文作者: 高宇翔(大胃) 1.1.        背景 J2SE(TM) 5.0正式发布至今已超过...

Java基础——JDK5.0的简单新特性(静态导入、可变参数、增强型for循环、自动拆装箱)

1.静态导入 import:导入一个包中某个类或所有类 import static:导入一个类中某个静态方法或所有静态方法 import static java.lang.Math.*; ...
  • ayhlay
  • ayhlay
  • 2013年06月17日 14:09
  • 2340

Java中的类装载机制、反射机制、JDK5.0版本新加入一些特性

一、类装载器     1.Java虚拟机使用每一个类的第一件事就是将该类的字节码装载进来,装载字节码的功能是由类装载器完成的。类装载器负责根据一个类的名称来定位和生成类的字节码数据,然后将这个字节码数...

Java5.0 共有九个新的特性(2)

特性三 静态导入  import 导入目标包的指定类  import static 导入目标类成员变量和方法 (当导入后,目标类静态成员变量和方法,可以作为当前类成员变量方法 直接使用 )...

javaSE_8系列博客——Java语言的特性(五)--接口和继承(3)--实现接口

实现一个接口要声明一个实现接口的类,在类声明中包含一个implements子句。你的类可以实现多个接口,所以implements关键字后面是一个由类实现的接口的逗号分隔列表。按照惯例,implemen...

javaSE_8系列博客——Java语言的特性(三)--类和对象(16)--嵌套类(内部类的示例)

要看到正在使用的内部类,首先考虑一个数组。在下面的示例中,您将创建一个数组,用整数值填充数组,然后按升序排列数组的均匀索引值。下面的DataStructure.java示例包括: DataStruct...

javaSE_8系列博客——Java语言的特性(三)--类和对象(9)--对象的创建

你知道,一个类提供了对象的蓝图;你从类创建一个对象。从CreateObjectDemo程序中获取的每个以下语句创建一个对象并将其分配给一个变量:Point originOne = new Point(...

javaSE_8系列博客——Java语言的特性(三)--类和对象(19)--嵌套类(Lambda 表达式)

匿名类的一个问题是,如果您的匿名类的实现非常简单,例如仅包含一个方法的接口,则匿名类的语法可能看起来很笨重且不清楚。在这些情况下,您通常会尝试将function作为参数传递给另一种方法,例如当有人点击...

Java语言基础——06.集合框架(3)util包中的工具类和新特性

本节考点: 一、Collection 和 Collections的区别 二、Collections、Arrays中折半查找、排序等方法的使用 3-1 工具类 3-1-1 C...

javaSE_8系列博客——Java语言的特性(三)--类和对象(6)--为你的类提供构造函数

一个类包含被调用的构造函数,它是从类的蓝图创建对象的用的。构造函数声明看起来像方法声明,除了它们使用类的名称并且没有返回类型。例如,Bicycle有一个构造函数:public Bicycle(int ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:猛虎出山 —— Java 5.0的新语言特性
举报原因:
原因补充:

(最多只允许输入30个字)