JDK1.5新特性

来源:互联网 发布:北风网视频破解软件 编辑:程序博客网 时间:2024/05/08 00:19

 

泛型,for-each 循环,自动装包/拆包,枚举,可变参数, 静态导入 。使用这些特性有助于我们编写更加清晰,精悍,安全的代码。

 

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


2.for循环和高级for循环
 传统for循环可以通过增量完成循环的动作,让指定代码运行多次。
 增强for循环,遍历必须有目标,而且目标只能是数组和Collection单列集合
 通常增强for循环只用于遍历目标。在遍历过程中少有对元素的操作。
 而迭代器在遍历元素的建议遍历数组可以是增强for循环,也可以传统for循环。
 只为遍历可以增强for循环简化书写,一旦要对元素有其他操作时,要使用传统for循环。
 过程中,可以对遍历的元素进行操作比如remove

3.自动装包/拆包(Autoboxing/unboxing)
  自动装包/拆包大大方便了基本类型数据和它们包装类地使用。
  自动装包:基本类型自动转为包装类.(int >> Integer)
  自动拆包:包装类自动转为基本类型.(Integer >> int)


4.枚举(Enums)
  JDK1.5加入了一个全新类型的“类”-枚举类型。为此JDK1.5引入了一个新关键字enmu. 我们可以这样来定义一个枚举类型。 
public enum Color
{
   Red,
   White,
   Blue
}

  然后可以这样来使用Color myColor = Color.Red.
  枚举类型还提供了两个有用的静态方法values()和valueOf(). 我们可以很方便地使用它们,例如
 for (Color c : Color.values())
 System.out.println(c);

 

枚举就是要让某个类型的变量的取值只能为若干个,否则编译器就会报错。枚举可以让编译器在编译
时就可以控制源程序中填写非法值。

Weekday的类来模拟枚举功能。
私有的构造方法。
每个元素分别用一个公有的静态成员变量表示。
可以有若干公有方法或抽象方法,例如,要提供nextDay方法必须是抽象的。
采用抽象方法定义nextDay就将大量的if else语句转移成了一个独立的类。

public enum TrafficLamp{
 RED(30){
  public TrafficLamp nextLamp() {//使用到了匿名内部类,继承TrafficLamp,实现该类中的抽象方法
   return GREEN;
  }
 },
 GREEN(45){
  public TrafficLamp nextLamp() {
   return YELLOW;
  }
 },
 YELLOW(5){
  public TrafficLamp nextLamp() {
   return RED;
  }
 };
 
 public abstract TrafficLamp nextLamp();
 private int time;
 private TrafficLamp(int time)
 {
  this.time=time;
 }
}

枚举类有一个静态方法valueOf
可以直接将字符串变成值。

 

 

 


5.可变参数(Varargs)
  可变参数使程序员可以声明一个接受可变数目参数的方法。注意,可变参数必须是函数声明中的最后一个参数。
假设我们要写一个简单的方法打印一些对象,
util.write(obj1);
util.write(obj1,obj2);
util.write(obj1,obj2,obj3);

  在JDK1.5之前,我们可以用重载来实现,但是这样就需要写很多的重载函数,显得不是很有效。
如果使用可变参数的话我们只需要一个函数就行了
public void write(Object... objs) {
   for (Object obj: objs)
      System.out.println(obj);
}
  在引入可变参数以后,Java的反射包也更加方便使用了。
对于c.getMethod("test", new Object[0]).invoke(c.newInstance(), new Object[0])),
现在我们可以这样写了c.getMethod("test").invoke(c.newInstance()),这样的代码比原来清楚了很多。 

 

6.静态导入(Static Imports)
  要使用用静态成员(方法和变量)我们必须给出提供这个方法的类。
使用静态导入可以使被导入类的所有静态变量和静态方法在当前类直接可见,使用这些静态成员无需再给出他们的类名。
import static java.lang.Math.*;
…….
r = sin(PI * 2); //无需再写r = Math.sin(Math.PI);
  不过,过度使用这个特性也会一定程度上降低代码地可读性。


原创粉丝点击