java JDK1.5 新特性总结

 

  新特性的出现,要么是为了简化开发,要么是为了增强程序的安全性,在jdk1.5中出现了许多新特性:下面就一一论述下:

1.  静态导入 :import  static

    普通的import可以导入一个类或者某个包中的所有类

    而静态导入是导入某个类下的某个或所有静态的方法

    在java的类库中有大量的为了简化开发而出现的工具类,这些类的方法一般都是静态的,有了静态导入,我们在使用这些工具类方法时就可以    直接使用方法名了。

代码示例:

import java.util.*;
import java.util.Arrays.*;

...
    public static void main(String[] args) 
    {
        //对数组进行排序
        int[] arr = {2,5,44,52,10,110};
        //以前的做法:
        Arrays.sort(arr);
        //新特性做法
        sort(arr);
    }

注意: 

  默认包无法用静态导入。

  如果导入的类中有重复的方法和属性则需要写出类名,否则编译时无法通过。

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

 

2.  可变参数 :

  一个方法接收的参数个数不确定

 

格式:返回类型 方法名 (参数类型... 参数名) {...方法体...}

 

特点:

 

    1、出现在参数列表的最后

 

    2、变参数类型和变量之间,前后有无空格都可以

 

    3、调用可变参数的方法时,编译器为该可变参数隐式创建了一个数组,在方法体中以数组形式访问可变参数

 

代码示例:

 

假设我们要写一个简单的方法打印一些对象,

//以前的做法
void write(obj1);

void write(obj1,obj2);

void write(obj1,obj2,obj3);
......

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

void write(Object... objs) 
{
    for (Object obj: objs)
        System.out.println(obj);
}

 3.  高级for循环 :

   语法 :
       for(类型 变量名 : 要被遍历的数组或集合变量名)
       {
          ...
       }

      注意 :
          · 迭代变量必须在()中定义
          · 集合变量必须是数组或实现了Iterable接口的集合类

代码示例:

//普通for循环
public static void for_1()
{    
    List<String> list = new ArrayList<String>();
    //普通for循环
    for (int i = 0;i<list.size() ;i++ )
    {
        System.out.println(list.get(i));
    }

}

//增强for循环
public static void for_2()
{    
    List list = new ArrayList<String>();
    for (List<String> l: list)
        System.out.println(l);
}

 4.  基本数据类型的自动装箱和拆箱

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

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

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

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

代码示例:

基本数据类型的对象缓存:

Integer num1 = 2;

Integer num2 = 2;          

System.out.println(num1 == num2);//结果为:true

 

 注意:当数字在-128—127之间时,Integer不会新开辟空间,

这其实也是一种设计模式,称为享元设计模式:

  若果有很多很小的对象,它们有很多相同的东西,可以把它们变成一个对象,不用的东西把他们变成外部的属性,作为方法的参数传入。

Integer num3 = 129;           

Integer num4 = 129;

System.out.println(num3 == num4);//结果为flase

 5.  枚举(是一种特殊的类)

  概念介绍:

     1、枚举让某个类型的变量的取值只能为若干个固定值中的一个,否则编译器就会报错。

       2、枚举可以让编译器在编译时就可以控制源程序中填入的非法值,而普通变量的方式在开发阶段无法实现这一目标     

       3、枚举的每一个元素都是一个枚举类型的对象

         4、枚举覆写了Object的toString()方法        

  特点:

  1、构造方法必须定义成私有的 

  2、枚举元素必须位于枚举体中的最开始部分。最后一个枚举元素后面加分号

  3、只要用到枚举类,枚举类里的元素都会初始化,调用无参的构造方法

  4、如要调用有参,在元素后面加括号——>里面传入相应的类型参数

  5、当枚举里只有一个元素时,就可以作为一种单例的实现方式。 

代码示例:

public enum WeekDay
    {
       SUN(1),MON,TUE,WED,THI,FRI,SAT;//有参数的构造方法使用
       private WeekDay()
       {System.out.println("空构造方法");}
       private WeekDay(int day)
       {System.out.println("有参数构造方法");}
    }
    public enum TrafficLamp
    {
//由于枚举中含有抽象方法,因此枚举对象必须实现它,
//常用方式是匿名内部类
       RED(30)
       {
           public TrafficLamp nextLamp()
           {
              return GREEN;
           }
       },
       YELLOW(5){
           public TrafficLamp nextLamp()
           {
              return RED;
           }
       },
       GREEN(60){
           public TrafficLamp nextLamp()
           {
              return YELLOW;
           }
       };
       public abstract TrafficLamp nextLamp();
       private int time;
       private TrafficLamp(int time)
       {
           this.time=time;
       }
    }
}

   6.  注解(一种特殊的类)

  特点:

   1、相当于在程序中打了标记,根据标记编译器会做出相应的处理

    2、注解是一个特殊的类,每一个注解都是一个类,调用注解就相当于创建了注解类的实例对象

    3、注解类上的注解,称为 "元注解",它只作用于注解类

例如 : 
        @Retention() :表示注解类的生命周期 
        它有三种取值:
           |-- RetentionPolicy.SOURCE --> java源文件
           |-- RetentionPolicy.CLASS --> class文件
           |-- RetentionPolicy.RUNTIME --> 内存中的字节码(运行时期)

      ·RetentionPolicy 是枚举
         它的取值有三种 :SOURCE,CLASS,RUNTIME

      ·常用的注解类的 @Retention 
         |-- @Override --> RetentionPolicy.SOURCE
         |-- @SuppressWarnings --> RetentionPolicy.SOURCE
         |-- @Deprecated --> RetentionPolicy.RUNTIME

   ·注解的属性类型(返回值类型) :基本数据类型(byte,short,int,long,float,double,boolean,char),String类型,Class类型,enum枚举类型,annotation注解类型, 还可以是以上类型的array数组类型。

个人认为最有用的注解:

  在开发中我们经常需要覆写父类或超类的成员方法,加上@override 会使我们在覆写时出现的错误直接在编译期被报出。。。简化了开发难度

   7、泛型

 由于泛型的内容过多,因此在此篇不再论述,在另一篇中会详细介绍     

 

 

 

 

 

 

 

 

 

 

 

 

posted on 2013-02-02 14:28  Xiaobin.Wang  阅读(166)  评论(0)    收藏  举报

导航