“JDK1.5”的一个重要主题就是通过新增一些特性来简化开发。
JDK1.5的新特性(静态导入 、可变参数、自动装箱拆箱 、增强for循环 、枚举、注解和泛型等),反射,框架,内省,泛型和代理等内容。
1.静态导入
要使用用静态成员(方法和变量)我们必须给出提供这个方法的类。使用静态导入可以使被导入类的所有静态变量和静态方法在当前类直接可见,使用这些静态成员无需再给出他们的类名。
例子代码:
import static java.lang.Math.*;
r = sin(PI * 2); //无需再写r = Math.sin(Math.PI);
不过,过度使用这个特性也会一定程度上降低代码地可读性。
2.可变参数
可变参数,使程序员可以声明一个参数数目可变的方法。注意,可变参数必须是方法声明中的最后一个参数。
假设我们要写一个简单的方法打印一些对象,
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()),这样的代码比原来清楚了很多。
3.自动装包/拆包(Autoboxing/unboxing)
自动装包/拆包大大方便了基本类型数据和它们包装类地使用。
自动装包:基本类型自动转为包装类.(int >> Integer)
自动拆包:包装类自动转为基本类型.(Integer >> int)
在JDK1.5之前,我们总是对集合不能存放基本类型而耿耿于怀,现在自动转换机制解决了我们的问题。
例子:
int a = 3;
Collection c = new ArrayList();
c.add(a);//自动转换成Integer.
Integer b = new Integer(2);
c.add(b + 2); 这里Integer先自动转换为int进行加法运算,然后int再次转换为Integer.
4.增强的for循环
J2SE 1.5提供了另一种形式的for循环。借助这种形式的for循环,可以用更简单地方式来遍历数组和Collection等类型的对象。
For(类型 变量名 : 容器) 形式的for循环, 循环第一次时将容器中第一个元素取出赋值给变量, 第二次取第二个, 直到所有元素都被获取过。
例子:
List<Integer> list =new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
for(int i : list){
System.out.println(i);
}
5.泛型
可以在编译的时候检测出类型错误,编译后和没有使用泛型的效果是相同的,但是使用泛型可以让你在编译时就发现错误,例如:
1 import java.util.ArrayList;
2 import java.util.Collection;
3 import java.util.Iterator;
4
5 public class GenericTest {
6 public static void main(String[] args) {
7 Collection c = new ArrayList();
8 c.add(new Integer(1));
9 c.add("123");
10 for(Iterator i=c.iterator();i.hasNext();){
11 String s = (String) i.next();
12 System.out.println(s);
13 }
14 }
15 }
16
17 运行结果:
18 Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
19 at GenericTest.main(GenericTest.java:12)
Collection应该只存放String对象,但是我们“不小心”添加了一个Integer类型的对象,编译正常进行,程序在运行时才发现错误。
下面是使用了泛型后的程序
20 import java.util.ArrayList;
21 import java.util.Collection;
22 import java.util.Iterator;
23
24 public class GenericTest {
25 public static void main(String[] args) {
26 Collection<String> c = new ArrayList<String>();
27 c.add(new Integer(1));
28 c.add("123");
29 for(Iterator<String> i=c.iterator();i.hasNext();){
30 String s = i.next();
31 System.out.println(s);
32 }
33 }
34 }
35
36 运行结果
37 D:\test>javac GenericTest.java
38 GenericTest.java:8: 无法将 java.util.Collection<java.lang.String> 中的 add(java.lang.String) 应用于 (java.lang.Integer)
39 c.add(new Integer(1));
40 ^
41 1 错误
42
43 D:\test>
使用了泛型之后在编译时就发现了错误,可以增强程序的健壮性,而其i.next();也不用使用强制类型转换了。
6.枚举
当每一类型可取值范围是有限的时候,可以使用枚举。例如每个学生成绩只能用ABCD表示,如果直接用E的话,那么编译不会出错,但是却不符合输入要求,而使用枚举增加程序的易读性和健壮性?
代码事例:
public class GradeTest {
public static void main(String[] args) {
Student stu = new Student();
stu.setName("wasw100");
5 stu.setGrade(Grade.A);
6 //输出学生信息
7 System.out.println(stu);
8 }
9 }
10
11 /**
12 * 枚举:Grader 学生考试等级
13 * @author wasw100
14 */
15 enum Grade{
16 A,B,C,D
17 }
18
19 class Student {
20 private String name;
21 private Grade grade;
22
23 //重写toString()方法
24 public String toString(){
25 return "name:+"+name+"\ngrader:"+grade;
26 }
27
28 public String getName() {
29 return name;
30 }
31
32 public void setName(String name) {
33 this.name = name;
34 }
35
36 public Grade getGrade() {
37 return grade;
38 }
39
40 public void setGrade(Grade grade) {
41 this.grade = grade;
42 }
43
44 }
----------------------android培训java培训 期待与您交流! ----------------------