JDK5.0新特性

发布: 2008-6-28 21:58 | 作者: sunming | 来源: 青软培训-踏踏实实育人-勤勤恳恳奉献

“jdk1.5”(开发代号猛虎)的一个重要主题就是通过新增一些特性来简化开发,这些特性包括泛型,for-each 循环,自动装包/拆包,枚举,可变参数, 静态导入 。使用这些特性有助于我们编写更加清晰,精悍,安全的代码。
  下面我们简单介绍一下这些新特性。

  1.泛型(generic)

  c++通过模板技术可以指定集合的元素类型,而java在1.5之前一直没有相对应的功能。一个集合可以放任何类型的对象,相应地从集合里面拿对象的时候我们也不得不对他们进行强制得类型转换。猛虎引入了泛型,它允许指定集合里元素的类型,这样你可以得到强类型在编译时刻进行类型检查的好处。




<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1">
    <tbody>
        <tr>
            <td>collection<string> c = new arraylist();
            c.add(new date());</td>
        </tr>
    </tbody>
</table>


  编译器会给出一个错误:



<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1">
    <tbody>
        <tr>
            <td>add(java.lang.string) in java.util.collection<java.lang.string> cannot be applied to (java.util.date)</td>
        </tr>
    </tbody>
</table>


  2.for-each循环

  for-each循环得加入简化了集合的遍历。假设我们要遍历一个集合对其中的元素进行一些处理。典型的代码为:



<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1">
    <tbody>
        <tr>
            <td>void processall(collection c){
                for(iterator i=c.iterator(); i.hasnext();){
                    myclass myobject = (myclass)i.next();
                    myobject.process();
                }
            }</td>
        </tr>
    </tbody>
</table>


  使用for-each循环,我们可以把代码改写成:



<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1">
    <tbody>
        <tr>
            <td>void processall(collection<myclass> c){
                for (myclass  myobject :c)
                    myobject.process();
            }</td>
        </tr>
    </tbody>
</table>


  这段代码要比上面清晰许多,并且避免了强制类型转换。
  3.自动装包/拆包(autoboxing/unboxing)

  自动装包/拆包大大方便了基本类型数据和它们包装类地使用。

  自动装包:基本类型自动转为包装类.(int >> integer)

  自动拆包:包装类自动转为基本类型.(integer >> int)

  在jdk1.5之前,我们总是对集合不能存放基本类型而耿耿于怀,现在自动转换机制解决了我们的问题。




<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1">
    <tbody>
        <tr>
            <td>int a = 3;
            collection c = new arraylist();
            c.add(a);//自动转换成integer.
            
            integer b = new integer(2);
            c.add(b + 2);</td>
        </tr>
    </tbody>
</table>


  这里integer先自动转换为int进行加法运算,然后int再次转换为integer.

  4.枚举(enums)

  jdk1.5加入了一个全新类型的“类”-枚举类型。为此jdk1.5引入了一个新关键字enmu. 我们可以这样来定义一个枚举类型。
 


<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1">
    <tbody>
        <tr>
            <td>public enum color
            {
               red,
               white,
               blue
            }</td>
        </tr>
    </tbody>
</table>


  然后可以这样来使用color mycolor = color.red.

  枚举类型还提供了两个有用的静态方法values()和valueof(). 我们可以很方便地使用它们,例如



<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1">
    <tbody>
        <tr>
            <td>for (color c : color.values())
                        system.out.println(c);</td>
        </tr>
    </tbody>
</table>


  5.可变参数(varargs)

  可变参数使程序员可以声明一个接受可变数目参数的方法。注意,可变参数必须是函数声明中的最后一个参数。假设我们要写一个简单的方法打印一些对象,



<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1">
    <tbody>
        <tr>
            <td>util.write(obj1);
            util.write(obj1,obj2);
            util.write(obj1,obj2,obj3);
            …</td>
        </tr>
    </tbody>
</table>


  在jdk1.5之前,我们可以用重载来实现,但是这样就需要写很多的重载函数,显得不是很有效。如果使用可变参数的话我们只需要一个函数就行了



<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1">
    <tbody>
        <tr>
            <td>public void write(object... objs) {
               for (object obj: objs)
                  system.out.println(obj);
            }</td>
        </tr>
    </tbody>
</table>


  在引入可变参数以后,java的反射包也更加方便使用了。对于c.getmethod("test", new object[0]).invoke(c.newinstance(), new object[0])),现在我们可以这样写了c.getmethod("test").invoke(c.newinstance()),这样的代码比原来清楚了很多。 

  6.静态导入(static imports)

  要使用用静态成员(方法和变量)我们必须给出提供这个方法的类。使用静态导入可以使被导入类的所有静态变量和静态方法在当前类直接可见,使用这些静态成员无需再给出他们的类名。



<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1">
    <tbody>
        <tr>
            <td>import static java.lang.math.*;
            …….
            r = sin(pi * 2); //无需再写r = math.sin(math.pi);</td>
        </tr>
    </tbody>
</table>


  不过,过度使用这个特性也会一定程度上降低代码地可读性。


<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1">
    <tbody>
        <tr>
            <td>int a = 3;
            collection c = new arraylist();
            c.add(a);//自动转换成integer.
            
            integer b = new integer(2);
            c.add(b + 2);</td>
        </tr>
    </tbody>
</table>


  这里integer先自动转换为int进行加法运算,然后int再次转换为integer.

  4.枚举(enums)

  jdk1.5加入了一个全新类型的“类”-枚举类型。为此jdk1.5引入了一个新关键字enmu. 我们可以这样来定义一个枚举类型。
 


<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1">
    <tbody>
        <tr>
            <td>public enum color
            {
               red,
               white,
               blue
            }</td>
        </tr>
    </tbody>
</table>


  然后可以这样来使用color mycolor = color.red.

  枚举类型还提供了两个有用的静态方法values()和valueof(). 我们可以很方便地使用它们,例如



<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1">
    <tbody>
        <tr>
            <td>for (color c : color.values())
                        system.out.println(c);</td>
        </tr>
    </tbody>
</table>


  5.可变参数(varargs)

  可变参数使程序员可以声明一个接受可变数目参数的方法。注意,可变参数必须是函数声明中的最后一个参数。假设我们要写一个简单的方法打印一些对象,



<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1">
    <tbody>
        <tr>
            <td>util.write(obj1);
            util.write(obj1,obj2);
            util.write(obj1,obj2,obj3);
            …</td>
        </tr>
    </tbody>
</table>


  在jdk1.5之前,我们可以用重载来实现,但是这样就需要写很多的重载函数,显得不是很有效。如果使用可变参数的话我们只需要一个函数就行了



<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1">
    <tbody>
        <tr>
            <td>public void write(object... objs) {
               for (object obj: objs)
                  system.out.println(obj);
            }</td>
        </tr>
    </tbody>
</table>


  在引入可变参数以后,java的反射包也更加方便使用了。对于c.getmethod("test", new object[0]).invoke(c.newinstance(), new object[0])),现在我们可以这样写了c.getmethod("test").invoke(c.newinstance()),这样的代码比原来清楚了很多。 

  6.静态导入(static imports)

  要使用用静态成员(方法和变量)我们必须给出提供这个方法的类。使用静态导入可以使被导入类的所有静态变量和静态方法在当前类直接可见,使用这些静态成员无需再给出他们的类名。



<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1">
    <tbody>
        <tr>
            <td>import static java.lang.math.*;
            …….
            r = sin(pi * 2); //无需再写r = math.sin(math.pi);</td>
        </tr>
    </tbody>
</table>


  不过,过度使用这个特性也会一定程度上降低代码地可读性。
jdk1.5正式版已经发布,最新版本号:1.5.0.01,大家可以到sun网站下载!



<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1">
    <tbody>
        <tr>
            <td>collection<string> c = new arraylist();
            c.add(new date());</td>
        </tr>
    </tbody>
</table>


  编译器会给出一个错误:



<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1">
    <tbody>
        <tr>
            <td>add(java.lang.string) in java.util.collection<java.lang.string> cannot be applied to (java.util.date)</td>
        </tr>
    </tbody>
</table>


  2.for-each循环

  for-each循环得加入简化了集合的遍历。假设我们要遍历一个集合对其中的元素进行一些处理。典型的代码为:



<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1">
    <tbody>
        <tr>
            <td>void processall(collection c){
                for(iterator i=c.iterator(); i.hasnext();){
                    myclass myobject = (myclass)i.next();
                    myobject.process();
                }
            }</td>
        </tr>
    </tbody>
</table>


  使用for-each循环,我们可以把代码改写成:



<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1">
    <tbody>
        <tr>
            <td>void processall(collection<myclass> c){
                for (myclass  myobject :c)
                    myobject.process();
            }</td>
        </tr>
    </tbody>
</table>


  这段代码要比上面清晰许多,并且避免了强制类型转换。
  3.自动装包/拆包(autoboxing/unboxing)

  自动装包/拆包大大方便了基本类型数据和它们包装类地使用。

  自动装包:基本类型自动转为包装类.(int >> integer)

  自动拆包:包装类自动转为基本类型.(integer >> int)

  在jdk1.5之前,我们总是对集合不能存放基本类型而耿耿于怀,现在自动转换机制解决了我们的问题。




<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1">
    <tbody>
        <tr>
            <td>int a = 3;
            collection c = new arraylist();
            c.add(a);//自动转换成integer.
            
            integer b = new integer(2);
            c.add(b + 2);</td>
        </tr>
    </tbody>
</table>


  这里integer先自动转换为int进行加法运算,然后int再次转换为integer.

  4.枚举(enums)

  jdk1.5加入了一个全新类型的“类”-枚举类型。为此jdk1.5引入了一个新关键字enmu. 我们可以这样来定义一个枚举类型。
 


<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1">
    <tbody>
        <tr>
            <td>public enum color
            {
               red,
               white,
               blue
            }</td>
        </tr>
    </tbody>
</table>


  然后可以这样来使用color mycolor = color.red.

  枚举类型还提供了两个有用的静态方法values()和valueof(). 我们可以很方便地使用它们,例如



<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1">
    <tbody>
        <tr>
            <td>for (color c : color.values())
                        system.out.println(c);</td>
        </tr>
    </tbody>
</table>


  5.可变参数(varargs)

  可变参数使程序员可以声明一个接受可变数目参数的方法。注意,可变参数必须是函数声明中的最后一个参数。假设我们要写一个简单的方法打印一些对象,



<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1">
    <tbody>
        <tr>
            <td>util.write(obj1);
            util.write(obj1,obj2);
            util.write(obj1,obj2,obj3);
            …</td>
        </tr>
    </tbody>
</table>


  在jdk1.5之前,我们可以用重载来实现,但是这样就需要写很多的重载函数,显得不是很有效。如果使用可变参数的话我们只需要一个函数就行了



<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1">
    <tbody>
        <tr>
            <td>public void write(object... objs) {
               for (object obj: objs)
                  system.out.println(obj);
            }</td>
        </tr>
    </tbody>
</table>


  在引入可变参数以后,java的反射包也更加方便使用了。对于c.getmethod("test", new object[0]).invoke(c.newinstance(), new object[0])),现在我们可以这样写了c.getmethod("test").invoke(c.newinstance()),这样的代码比原来清楚了很多。 

  6.静态导入(static imports)

  要使用用静态成员(方法和变量)我们必须给出提供这个方法的类。使用静态导入可以使被导入类的所有静态变量和静态方法在当前类直接可见,使用这些静态成员无需再给出他们的类名。



<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1">
    <tbody>
        <tr>
            <td>import static java.lang.math.*;
            …….
            r = sin(pi * 2); //无需再写r = math.sin(math.pi);</td>
        </tr>
    </tbody>
</table>


  不过,过度使用这个特性也会一定程度上降低代码地可读性。
jdk1.5正式版已经发布,最新版本号:1.5.0.01,大家可以到sun网站下载!



<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1">
    <tbody>
        <tr>
            <td>int a = 3;
            collection c = new arraylist();
            c.add(a);//自动转换成integer.
            
            integer b = new integer(2);
            c.add(b + 2);</td>
        </tr>
    </tbody>
</table>


  这里integer先自动转换为int进行加法运算,然后int再次转换为integer.

  4.枚举(enums)

  jdk1.5加入了一个全新类型的“类”-枚举类型。为此jdk1.5引入了一个新关键字enmu. 我们可以这样来定义一个枚举类型。
 


<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1">
    <tbody>
        <tr>
            <td>public enum color
            {
               red,
               white,
               blue
            }</td>
        </tr>
    </tbody>
</table>


  然后可以这样来使用color mycolor = color.red.

  枚举类型还提供了两个有用的静态方法values()和valueof(). 我们可以很方便地使用它们,例如



<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1">
    <tbody>
        <tr>
            <td>for (color c : color.values())
                        system.out.println(c);</td>
        </tr>
    </tbody>
</table>


  5.可变参数(varargs)

  可变参数使程序员可以声明一个接受可变数目参数的方法。注意,可变参数必须是函数声明中的最后一个参数。假设我们要写一个简单的方法打印一些对象,



<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1">
    <tbody>
        <tr>
            <td>util.write(obj1);
            util.write(obj1,obj2);
            util.write(obj1,obj2,obj3);
            …</td>
        </tr>
    </tbody>
</table>


  在jdk1.5之前,我们可以用重载来实现,但是这样就需要写很多的重载函数,显得不是很有效。如果使用可变参数的话我们只需要一个函数就行了



<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1">
    <tbody>
        <tr>
            <td>public void write(object... objs) {
               for (object obj: objs)
                  system.out.println(obj);
            }</td>
        </tr>
    </tbody>
</table>


  在引入可变参数以后,java的反射包也更加方便使用了。对于c.getmethod("test", new object[0]).invoke(c.newinstance(), new object[0])),现在我们可以这样写了c.getmethod("test").invoke(c.newinstance()),这样的代码比原来清楚了很多。 

  6.静态导入(static imports)

  要使用用静态成员(方法和变量)我们必须给出提供这个方法的类。使用静态导入可以使被导入类的所有静态变量和静态方法在当前类直接可见,使用这些静态成员无需再给出他们的类名。



<table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#e6e4dd" border="1">
    <tbody>
        <tr>
            <td>import static java.lang.math.*;
            …….
            r = sin(pi * 2); //无需再写r = math.sin(math.pi);</td>
        </tr>
    </tbody>
</table>


  不过,过度使用这个特性也会一定程度上降低代码地可读性。
Google




姓名:
电话:
QQ或MSN:
您也可以拨打青软培训咨询电话预定周末免费技术讲座:    0532-85025005
王老师 尚老师 吴老师 于老师 谷老师

优秀就业学员

    青软培训-软件培训专家-王阿秀-青岛仁科 青软培训-软件培训专家-张琦-上海商联科技-JavaEE软件开发 青软培训-软件培训专家-刘奇-山东拓能集团-ASP.NET软件开发 青软培训-软件培训专家-郑磊-青岛乾懿德-网络部经理