jdk5.0中出现的新特性
• 泛型(Generics)
• 增强的“for”循环(Enhanced For loop)
• 自动装箱/自动拆箱(Autoboxing/unboxing)
• 类型安全的枚举(Type safe enums)
• 静态导入(Static import)
• 可变参数(Var args)
(一)泛型
泛型是JDK1.5中一个最重要的特征。通过引入泛型,我们将获得编译时类型的安全和运行时更小地抛出ClassCastExceptions的可能。
1) 简单泛型类的定义
public class Pair {
private T first;
private T second;
public Pair()
{
first = null;
second = null;
}
public Pair(T first, T second)
{
this.first = first;
this.second = second;
}
public T getFirst() {
return first;
}
public void setFirst(T first) {
this.first = first;
}
public T getSecond() {
return second;
}
public void setSecond(T second) {
this.second = second;
}
}
Pair类引入了一个类型变量T,用<>括起来,并放在类名的后面。泛型类可以有多个类型变量。例如:
public class Pair
类定义中的类型变量指定方法的返回类型以及域和局部变量的类型。
在java库中,使用变量E表示集合的元素类型,K和V分别表示表的关键字与值的类型。T表示任意类型。
2)泛型方法
public class ArrayAlg {
public static T getMiddle(T[] a)
{
return a[a.length /2];
}
}
3) 限制泛型可用类型
在定义泛型类别时,预设可以使用任何的类型来实例化泛型类型中的类型,但是如果想要限制使用泛型类别时,只能用某个特定类型或者是其子类型才能实例化该类型时,可以在定义类型时,使用extends关键字指定这个类型必须是继承某个类,或者实现某个接口
public static
当没有指定泛型继承的类型或接口时,默认使用T extends Object,所以默认情况下任何类型都可以作为参数传入
4)通配符类型
現在您有這麼一個需求,您希望有一個參考名称foo可以接受所有下面的实例
foo = new GenericFoo
foo = new GenericFoo
简单的说,实例化类型持有者时,它必須是实现List的类别或其子类别,要定义这样一个名称,您可以使用 ‘?’ 通配字元,并使用“extends”关键字限定类型持有者的型态
GenericFoo extends List> foo = null;
使用>或是 extends SomeClass>的声明方式,意味著您只能通过该名称來取得所参考实例的信息,或者是移除某些信息,但不能增加它的信息,因为只知道当中放置的是SomeClass的子类,但不确定是什么类的实例,编译器不让您加入信息,理由是,如果可以加入信息的話,那么您就得記得取回的实例是什么类型,
然后转换为原來的类型方可进行操作,这就失去了使用泛型的意义。
(二)For-Each循环
for(type element : array) {
System.out.println(element)....
}
(三)自动装箱/拆箱
自动装箱/拆箱大大方便了基本类型数据和它们包装类的使用。
自动装箱:基本类型自动转为包装类.(int >> Integer)
自动拆箱:包装类自动转为基本类型.(Integer >> int)
Integer 类有一个缓存,它会缓存介于-128~127之间的整数。
(四)枚举
JDK1.5加入了一个全新类型的“类”-枚举类型。为此 JDK1.5引入了一个新关键字enum. 我们可以这样来定 义一个枚举类型
public enum Color
{
Red,
White,
Blue
}
然后可以这样来使用Color myColor = Color.Red.
枚举类型还提供了两个有用的静态方法values()和valueOf().
当您使用“enum”定义 枚举类型时,实质上您定义出來的类型继承自 java.lang.Enum 类型,而每个枚举
的成员其实就是您定义的枚举类型的一個实例(Instance),他们都被预设为 final,所以您无法改变他们,他
们也是 static 成員,所以您可以通过类型名称直接使用他们,当然最重要的,它們都是公开的(public)。
(五)静态导入
要使用静态成员(方法和变量)我们必须给出提供这个静态成员的类。使用静态导入可以使被导入类的所有静态变量和静态
方法在当前类直接可见,使用这些静态成员无需再给出他们的类名
a) import static com.shengsiyuan.common.Common.Age;
b) import static com.shengsiyuan.common.Common.output;
(六)可变参数
可变参数使程序员可以声明一个接受可变数目参数的方法。注意,可变参数必须是方法声明中的最后一个参数