`
tenn
  • 浏览: 572322 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
文章分类
社区版块
存档分类
最新评论

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

阅读更多

2004年下半年,Sun公司发布了开发代号为“Tiger”的J2SE 5.0,揭开了Java发展的一个重要里程碑。在过去的Java升级中更多的是进行一些库函数的改进,而这次则直接从语法层面上进行了增强。直接从1.4跳到5.0(Sun本来是打算用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),这样能在编译时就发现类型不符,避免到运行时出现类型转换错误。

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

使用范型前:

 

  1. ArrayList list = new ArrayList();
  2. list.add(0, new Integer (42));
  3. int total = ((Integer )list.get(0)).intValue();

 

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

 

  1. ArrayList<Integer > list = new ArrayList<Integer >();
  2. list.add(0, new Integer (42));
  3. int total = list.get(0).intValue();

 

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

元数据(Metadata)

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

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

使用前:

 

  1. public interface PingIF extends Remote {
  2. public void ping() throws RemoteException;
  3. }
  4. public class Ping implements PingIF {
  5. public void ping() {
  6. ……
  7. }
  8. }

 

使用后:

public class Ping { public @remote void ping() { …… }} 自动装箱(Autoboxing)和自动拆箱(Auto-Unboxing)

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

以前:

 

  1. ArrayList<Integer > list = new ArrayList<Integer >();
  2. list.add(0, new Integer (42));
  3. int total = (list.get(0)).intValue();

 

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

 

  1. ArrayList<Integer > list = new ArrayList<Integer >();
  2. list.add(0, 42);
  3. int total = list.get(0);

 

枚举(Enumeration)

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

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

 

  1. public enum StopLight { red, amber, green };

 

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

增强的for循环

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

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

使用前:

 

  1. ArrayList<Integer > list = new ArrayList<Integer >();
  2. for (Iterator i = list.iterator(); i.hasNext();) {
  3. Integer value=(Integer )i.next();
  4. ……
  5. }

 

使用后:

 

  1. ArrayList<Integer > list = new ArrayList<Integer >();
  2. for (Integer i : list) {
  3. ……
  4. }

 

不定参数(Varargs)

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

 

  1. // 方法定义
  2. void argtest(Object ... args) {
  3. for (int i=0;i <args.length ; i++) {
  4. }
  5. }
  6.  
  7. // 调用方式
  8. argtest("test", "data");

 

静态导入(Static Import)

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

 

  1. // 静态导入
  2. import static java.awt.BorderLayout .*;
  3. // 调用静态成员
  4. getContentPane().add(new JPanel(), CENTER);

 

其它改变

上面所列的主要是一些Java 5在语言层面的升级,Java 5在基础类库、用户界面、虚拟机、执行效率等其它方面也进行了大量的升级。例如在基础类库方面,为范型的出现更新了集合框架,为方便多线程开发对线程同步进行了改进,为方便输入输出增加了新的Formatter和Scanner 类。对于这些方面我在这里就不再列举了,如果需要你可以查找相应的文档进行学习。

分享到:
评论

相关推荐

    java学习笔记

    - JDK1.5:代号“猛虎”,引入了泛型等新特性。 - JDK1.6:代号“野马”,改进了性能和稳定性。 - JDK1.7:代号“海豚”,增加了新的语言特性和API。 - **环境变量配置** - **PATH**:用于操作系统快速定位到JDK...

    Java学习笔记

    - JDK 1.5(5.0 猛虎) - JDK 1.6(6.0 野马) - JDK 1.7(7.0 海豚) - **环境变量设置**: - **PATH**:指定JDK的bin目录路径,使得可以在任何位置调用JDK提供的命令。 - **CLASSPATH**:指定类路径,用于...

    新特性很好

    JDK 1.5,亦称Java SE 5.0或代号为“Tiger”(猛虎),是Java发展史上的一个重要里程碑。这一版本引入了许多重要的新特性,旨在简化编程过程,提高代码的可读性和可维护性,并增强应用程序的性能。本文将详细介绍JDK...

    猛虎出閘5/6第1-3章

    本書支援310-065/066 Java SCJP 6.0認證考試 內容涵蓋Java基礎知識與認證考試範圍, 為您建立學習的正確觀念,輕易掌握關鍵考題。 SCJP 6.0 猛虎出閘? 讓您成為Java界的老虎伍茲!

    猛虎贺岁_csdn

    猛虎贺岁

    JDK1.5新特性介绍

    JDK1.5,开发代号“猛虎”,是Java发展历程中的...这些新特性显著提升了Java编程的效率和质量,降低了出错的可能性,是Java开发者不可或缺的工具。了解并熟练运用这些特性,能帮助我们编写出更加健壮、易于维护的代码。

    通达信指标公式源码 猛虎狂猎涨停板.doc

    本文将对通达信指标公式源码中的指标公式进行解析,包括猛虎狂猎涨停板指标公式和实时盘中猛虎狂猎涨停板预警指标公式的详细说明。 1. 猛虎狂猎涨停板指标公式: 该指标公式主要用于检测股票的涨停板情况,通过对...

    马年贺词,马年新春贺词,2014马年贺词.doc

    - "猛虎出山":形容行动迅速,气势雄浑。 - "蛇行虎变":指有识之士在变革中崭露头角,建立伟业。 - "蛇腾虎啸"、"蛇骧虎步"等:形容威武、雄壮的气势或动作。 这些成语展示了中国语言的丰富性和文化内涵,每个成语...

    猛虎决策通达信指标公式源码.doc

    猛虎决策通达信指标公式源码.doc

    通达信指标公式源码猛虎出笼分时副图.doc

    "猛虎出笼"是一个特定的分时副图指标,通过该公式,投资者可以观察实时股价变动与市场趋势,以辅助决策。下面我们将深入解析这个指标公式的各个部分。 首先,公式中引入了多个变量,如P、Q、A1至A4、B1至B4等。P和Q...

    通达信最好的分时指标——猛虎出笼.doc

    通达信最好的分时指标——猛虎出笼.doc

    Java设计模式+代码重构等PDF合集

    Java设计模式和代码重构是软件开发中的核心概念,它们对于编写高效、可维护的代码至关重要。这个PDF合集涵盖了这两个主题,旨在帮助开发者提升代码质量和软件设计能力。 首先,我们来详细了解一下Java设计模式。...

    通达信指标公式源码猛虎狂猎涨停板分时图指标.doc

    本篇将深入解析“猛虎狂猎涨停板分时图指标”的源码,帮助投资者理解其背后的逻辑和应用。 首先,我们来看源码中的关键变量和函数: 1. `虎`:这个变量计算了收盘价的500天指数移动平均线(EXPMA)与前一个交易日...

    mhFault:猛虎汽车故障云诊断系统

    mhFault猛虎汽车故障云诊断系统

    2010年虎年成语大全.doc

    13. **猛虎出山**:形容行动迅速且勇猛,如同猛虎下山。 14. **龙行虎变**:龙行走,虎变化,形容事物发展变化迅速。 15. **龙骧虎啸**:形容气概威武,如同龙马高昂,虎啸山林。 16. **龙威虎震**:形容气势雄壮,...

    通达信猛虎抓龙头副图选股指标.doc

    通达信猛虎抓龙头副图选股指标是一个用于股票交易分析的自定义技术指标,它设计的目的是在股票市场中捕捉具有潜在上涨潜力的“龙头”股票。该指标结合了多个技术分析元素,如移动平均线、相对强弱指数、价格波动范围...

    java代码统计工具-java代码统计工具

    非常好用的JAVA代码统计工具,直接执行即可

    原生java实现游戏-飞行射击类小游戏-以纪念训练.zip

    原生java实现游戏——飞行射击类小游戏——以纪念训练 —————————————————— 游戏简介 ● 一款俯视角的飞行射击类游戏,因不明原因导致主角被困不明地点,敌军从四面八方袭来,如同猛虎扑食,完全...

    现代编译原理-c语言描述(虎书)

    编译原理是计算机科学中的一个重要分支,它研究如何将高级编程语言(如C、Java等)转换为机器可以理解的低级指令集。这一过程分为多个阶段:词法分析、语法分析、语义分析、优化以及目标代码生成。以下是对这些主要...

    tiger:TigerScript 是一种开源脚本语言,它是类型安全的、面向对象的

    TigerScript,正如其名,是一种如同猛虎般强大而灵活的开源脚本语言。它以其类型安全性和面向对象的设计理念,为开发者提供了一个高效、可靠的编程环境。在本文中,我们将深入探讨TigerScript的主要特点、语法结构...

Global site tag (gtag.js) - Google Analytics