静态导入是J2SE5.0新推出的特性之一,具体实现是再导入包前加上static 关键字,通过静态导入可以减少代码书写,但可读性可能相对变低。具体如下:
二、Varargs
可变参数的应用是在当方法的参数不确定时,可以通过“... args”的形式,省略中间需要传递的n个参数,在调用这个方法时,java 编译器会为该可变参数创建一个数组,在方法体中,以数组的形式访问可变参数。这为方法重载提供了方便,同时也提高了方法的可扩展性和灵活性。
三、Enhanced for each loop
增强for循环,这个在现在的编码过程中已经很常见见了,通过”for type 变量名:变量集合名”语法来进行循环。
四、Autoboxing/unboxing
拆箱:把类转换成基础类型,如Integer转成int。
装箱:把基础类型封装成一个类。比如把int封装成Integer,这时你就不能把他当成一个数进行加减,而是一个类,使用方法对它进行操作。
所谓自动拆箱装箱,简单来说,原来在5.0之前的版本,形如Integer Iobj=4,这行代码是会编译报错的,通过自动拆箱之后,5.0中就可以把Integer自动转换成对应的基本数据类型int。
自动装箱(拆箱)的原理是:在一定范围内,一旦将int类型包装成Integer对象之后,就会把它缓存起来,下次再遇到需要进行此类装箱操作时,直接从缓冲池里获取,没必要每次都去创建一个对应的Integer对象。这个范围控制在一个字节,也就是-128~127之间的所有int数值。
这里应用到了一个设计模式:flyWeight-享元模式,也就是说在一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象;应对这个共享对象的特性,可以把这些属性、方法作为对象的外部属性,作为参数传入。这对java内存和系统效率都是个不小的提高。
五、Enumerations
枚举类诞生的目的就是圈定某个类型的变量取值只能为某几个固定值。If not ,编译不通过。这样可以使源程序在编译时就控制填入非法值,缩小了变量的输入范围和类型。枚举的每个元素都是这个枚举类的一个实例对象,例如调用WeekDay.SUN.getClass();
下面给出每个特性的具体实例。
package it.webservice.mobile; import static java.lang.System.*; //静态导入 import static java.lang.Math.*; public class MobileService { /* * 测试静态导入 */ public static void main(String[] args) { out.println("dhafkjdhskfjh"); out.println(abs(-1)); //测试可变参数add方法 add(2,2,3,3,3); addFor(1,1,1,1); autoBox(); //测试枚举类 WeekDay day=new WeekDay.MON; } /* * 可变参数 */ public static void add(int a,int b,int ...args) { int sum=0; for(int i=0;i<args.length;i++) { sum+=args[i]; } System.out.println(sum);//9 } /* * 增强for循环 */ public static void addFor(int a,int...args) { int sum=0; for(int arg:args) { sum+=arg; } System.out.println(sum);//3 } /* * 自动拆箱装箱 */ public static void autoBox() { //自动装箱 Integer iObj=44; //自动拆箱 System.out.println(iObj+1); //基本数据类型的对象缓存 Integer iObj1=12; Integer iObj2=12; System.out.println(iObj1==iObj2);//t //超过一个字节 Integer iObj3=129; Integer iObj4=129; System.out.println(iObj3==iObj4);//f //转成int再对比 Integer iObj5=Integer.valueOf(33); Integer iObj6=Integer.valueOf(33); System.out.println(iObj5==iObj6);//t } }
//枚举类 public enum WeekDayEnum { SUN,MON,TUE,WED,THI } //普通类 public class WeekDay { //私有的构造方法,避免其他类创建该类 private WeekDay(){} public final static WeekDay SUN=new WeekDay(); public final static WeekDay Mon=new WeekDay(); }
虽然现在J2SE已经更新到了8.0,并且9.0也即将在今年问世。但是对于一个具有改革意义的J2SE5.0是不可不提的。就好比在1.1中已经提出了反射,而且都在提反射、泛型在java语言中的地位,但到现在大部分java开发者依旧很少使用到或者说不熟悉这些技术的应用。笔者接下来就会针对java每个迭代版本中所涉及到的核心技术进行总结分析。从头体会java语言的魅力之处。