猛虎出山 —— 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 类。

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

 

Android5.0,6.0,7.0新特性整理

背景 概述内容 Android 50新特性 1 Material Design 2支持多种设备 3全新通知中心设计 4支持64位ART虚拟机 5 Project Volta电池续航改进计划 6全新的最...
  • haovip123
  • haovip123
  • 2017年01月19日 20:18
  • 6367

Java 8的新特性—终极版

前言: Java 8 已经发布很久了,很多报道表明Java 8 是一次重大的版本升级。在Java Code Geeks上已经有很多介绍Java 8新特性的文章,例如Playing with Java ...
  • yczz
  • yczz
  • 2016年03月15日 15:38
  • 47767

安卓5.0 6.0新特性简单总结

Android 5.0新特性 1. 了解Material Design 概念:融合卡片式,立体式的设计风格,强调层次感,动画,阴影等元素国内翻译介绍:查看 http://design.1ste...
  • tianzhu2725
  • tianzhu2725
  • 2016年10月10日 10:27
  • 10815

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

J2SE 5.0专题 之 语言特性(转载)                          本文作者: 高宇翔(大胃) 1.1.        背景 J2SE(TM) 5.0正式发布至今已超过...
  • bswangjian
  • bswangjian
  • 2011年03月30日 10:35
  • 281

Java jdk5.0新特性——泛型

/** * @author StormWangxhu * @version 创建时间:2017年11月6日 下午8:27:45 * */泛型集合可以存储任何类型的对象,但是当把一个对象存入集合后,集合...
  • qq_36734216
  • qq_36734216
  • 2017年11月06日 20:51
  • 54

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

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

java基础——JDK5.0新特性

1、静态导入:不是很常用       使用这个方法可以简化书写,简化对类静态属性和方法的调用       语法:import static 包名.类名.静态属性|静态方法|*       例:impo...
  • siyemuzi
  • siyemuzi
  • 2015年04月01日 20:56
  • 354

黑马程序员——JAVA学习笔记——Jdk5.0新特性

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- Jdk5.0新特性: 1、JAVA新特性对数组的支持 1.1   可变参数: 以往:调用...
  • tubao1991
  • tubao1991
  • 2015年03月22日 12:34
  • 188

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

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

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

特性三 静态导入  import 导入目标包的指定类  import static 导入目标类成员变量和方法 (当导入后,目标类静态成员变量和方法,可以作为当前类成员变量方法 直接使用 )...
  • Youzh178
  • Youzh178
  • 2012年09月24日 22:54
  • 380
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:猛虎出山 —— Java 5.0的新语言特性
举报原因:
原因补充:

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