----------- android培训、java培训、java博客、java学习型技术博客、期待与您交流! --------------
本章主要的知识点总结:1、泛型作用的简单介绍和高级for循环的运用
2、基本数据的自动拆装箱及享元设计模式
3、 枚举类的介绍
4、可变参数和静态导入的使用
JDK1.5新特性
JDK1.5一个重要主题就是通过新增一些特性来简化开发,这些特性包括泛型,for-each 循环,自动装包/拆包,枚举,可变参数, 静态导入 。
1.泛型(Generic)
一个集合可以放任何类型的对象,相应地从集合里面拿对象的时候我们也不得不对他们进行强制得类型转换。之前我们放入集合的对象都定义为Object,在取出的时候进行强制类型的转换。而在JDK1.5中引入了泛型,它允许指定集合里元素的类型,这样就可以在编译的时候对强制类型转换进行检测。
其中又包括泛型类和泛型方法,泛型类在声明对象的时候需指明类型,并且类型是一致的。而泛型方法可以被任意类型的对象调用。
class Utils {
private T t;
public void setType(T t)
{ this.t=t; }
}
class GenFun {
public void printT(T t)
{ System.out.println("Show t="+t);
}
}
2.For-Each循环
For-Each循环的加入简化了集合的遍历。假设我们要遍历一个集合对其中的元素进行一些处理。以前大多使用迭代器:
void processAll(Collection c) {
for(Iterator i=c.iterator(); i.hasNext();)
{
MyClass myObject = (MyClass)i.next();
}
}
使用For-Each循环,我们可以把代码改写成,
void processAll(Collection c){
for (MyClass myObject :c) {
myObject.process();
}
}
语法:for(type 变量名:集合变量名或者数组){...}
注意事项:使用高级for循环,可以简化书写,它只能对获取集合元素,不能对集合进行操作;而使用迭代器还可以执行remove()操作;如果用ListIterator,还可以在遍历过程中对集合进行增删改查的动作。
另外,与传统for循环相比,高级for循环有局限性,它必须要有被遍历的目标,遍历数组时,建议使用传统for循环,因为可以定义脚标。
3.自动装包/拆包
自动装包/拆包大大方便了基本类型数据和它们包装类地使用。
自动装包:基本类型自动转为包装类.(int ——> Integer)
自动拆包:包装类自动转为基本类型.(Integer ——> int)
int a = 3;
Collection c = new ArrayList();
c.add(a);//自动转换成Integer.
Integer b = new Integer(2);
c.add(b + 2);
这里Integer先自动转换为int进行加法运算,然后int再次转换为Integer.
在一字节内的整数(-128~127)由于使用频率高,在封装成对象时,就缓存起来了。以便复用,这种模式叫享元模式。
如果很多很小的对象,它们有很多相同的东西,那就可以把它们变成一个对象,还有些不同的东西,可将它们变成外部的属性作为方法的参数传入。这种模式叫 享元模式。
4.枚举(Enums)
JDK1.5加入了一个全新类型的“类”-枚举类型。为此JDK1.5引入了一个新关键字enmu. 我们可以这样来定义一个枚举类型。
public enum Color
{Red, White, Blue}
然后可以这样来使用Color myColor = Color.Red.
枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。
枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。
用普通类如何实现枚举功能,定义一个Weekday的类来模拟枚举功能。
(1)私有的构造方法。
(2)每个元素分别用一个公有的静态成员变量表示。
(3)可以有若干公有方法或抽象方法,例如,要提供nextDay方法必须是抽象的。
采用抽象方法定义nextDay就将大量的if.else语句转移成了一个个独立的类。
枚举类的代码实例
- public class EnumTest
- {
- public static void main(String[] args)
- {
- WeekDay weekDay2 = WeekDay.FRI;
- System.out.println(weekDay2);
- System.out.println(weekDay2.name());
- System.out.println(weekDay2.ordinal());
- System.out.println(WeekDay.valueOf("SAT"));
- System.out.println(WeekDay.values().length);
- }
- public enum WeekDay
- {
- SUN,MON,TUE,WEd,THI,FRI,SAT;
- }
- }
5.可变参数
可变参数的特点:
实际上是将数组参数的简写形式。只能出现在参数列表的最后;...位于变量类型和变量名之间,前后有无空格都可以;调用可变参数的方法时,编译器为该可变参数隐含创建一个数组, 在方法体中以数组的形式访问可变参数。
6.静态导入(Static Imports)
要使用用静态成员(方法和变量)我们必须给出提供这个方法的类。使用静态导入可以使被导入类的所有静态变量和静态方法在当前类直接可见,使用这些静态成员无需再给出他们的类名。
import static java.lang.Math. max; 导入Math类中的max静态方法。