现在的位置: 首页 > 综合 > 正文

JDK1.5新特性

2014年06月25日 ⁄ 综合 ⁄ 共 2534字 ⁄ 字号 评论关闭

JDK中新增了很多新的JAVA特性,利用这些特性可以帮助开发人员编写出更加高效,清晰,安全的代码,具体有一下几种。

1 静态导入

2 自动装箱/拆箱

3 增强for循环

4 可变参数

5 枚举

6 反射

7 泛型

1 静态导入

JDK1.5 增加的静态导入语法用于类的某个静态属性或方法。

使用静态导入可以简化程序对类静态属性和方法的调用。

2 自动装箱/拆箱

JDK 5.0语法允许开发人员把一个基本数据类型值赋给对应的包装类变量,或者赋给Object类型的变量,这个过程称之为自动装箱。

自动拆箱与自动装箱与之相反,即把包装类对象直接赋给一个对应的基本类型变量。

 List list = new ArrayList();//因为集合中不能存储基本数据类型数据
 list.add(1);//会自动的装箱成(new Integer(1))

 int j
= (Integer)list.get(0);//自动拆箱

3 增强for循环

引入增强For循环的原因

在JDK5以前的版本中,遍历数据或集合中的元素,需要获得数组的长度或集合的迭代器,比较麻烦。

因此JDK5中定义了一种新的语法-增强For循环,以简化此类操作。

增强for循环只能用在数组、或实现Iterator接口的集合类上。

语法格式:

for(变量类型 变量:需要迭代的数组或集合){ }

4 可变参数

从JDK5开始,JAVA允许为方法定义长度可变的参数。语法:

public void foo(int...args){ }

注意事项:调用可变参数的方法时,编译器将自动创建一个数组保存传递给方法的可变参数,因此

程序员可以在方法中以数组的形式访问可变参数,可变参数只能处于参数列表的最后,所以一个方法最多只能都有一个可变参数。

可变参数总结:

1 可以使用传统方式传入一个数组,或直接传入单个元素。

2 编译器会将可变参数看成是一个一维数组。

3 可变参数只能放置在参数的最后

4 可变参数只能在参数中有一个

5 枚举类

1 为什么需要枚举

一些方法在运行时,它需要的数据不能是任意的,而必须是一定范围内的值,此类问题在JDK5以前采用自定义带有枚举功能的类解决,

Java5以后可以直接使用枚举解决。JDK5新增的enum关键字用于定义一个枚举类。

2 枚举类具有如下特性

枚举类是一种特殊形式的java类。

枚举类中声明的每一个枚举值代表枚举类的一个实例对象。

3 与java中的普通类一样,在声明枚举类时,也可以声明属性,方法和构造函数,但枚举类的构造函数必须为私有的。

4 枚举类也可以实现接口,或继承抽象类。

5 JDK5中扩展了switch语句,它除了可以接受int,byte,char,short外,还可以接受一个枚举类型。

6 若枚举类只有一个枚举值,则可以当做单例设计模式使用。

JAVA中声明的枚举类,均是java.lang.Enum类的孩子,它继承了Enum类的所有方法。常用方法。

name()

ordinary()

valueOf(Class enumClass,String name)

values()此方法虽然在JDK文档中查不到,但每个枚举类都具有该方法,他遍历枚举类的所有枚举值非常方便。

6 泛型(generic)

泛型是java1.5出现的新特性,泛型的出现把很多的ClassCastException即运行时异常转为编译时异常,

可以说极大的提高了程序的健壮性。

泛型是跟编译器配套使用的。但是泛型的技术并没有像C++做的那么好,在编译的时候也写进class文件中。

在JAVA中,在编译为class文件的时候,把泛型类型去掉了。即在class文件中没有泛型的踪影。但是在程序运行的时候,

JAVA会读取元素的类型进行一系列的转换。

泛型的好处:

1 把运行时的异常转到了编译阶段

2 避免了强制类型的转换

泛型的基本术语,以ArrayList<E>为例

ArrayList<E>中的E称为类型参数变量

ArrayList<Integer>中的Integer称为实际类型参数

整个称为ArrayList<E>泛型类型

整个ArrayList<Integer>称为参数化类型

7 反射

反射就是把java类中的各种成分映射成一个个的java对象。

例如,一个类有:成员变量,方法,构造方法,包等等信息,利用反射技术可以对一个类进行解剖,把各个组成部分映射成一个个对象。

Class类

Class类用于表示.class文件,是所有加载进内存的字节码对象的父类。所有可以通过Class的得到运行时的类。

如何得到某个class文件对应的class对象,方法有3种。

类型.class

对象.getClass()

Class.forName(“类名”);

Constructor类

 Constructor类的实例对象代表类的一个构造方法。

得到某个类所有的构造方法。

Constructor constructor = Class.forName(“java.lang.String”).getConstructor(StringBuffer.class);

用构造方法创建实例对象:

String str = (String)constructor.newInstance(“abc”);
方法创建实例对象。

反射公共,私有和保护的构造方法:

反射公共的需要的方法是:getConstructor()

反射私有的需要的方法是:getDeclaredConstructor()

Field类代表某个类中的一个成员变量
 问题:得到的Field对象是对应到类上面的成员变量,还是对应到对象上的成员变量?类只有一个,而

        该类的实例对象有多个,如果是与对象关联,那关联的是哪个对象呢?所以字段fieldX 代表的

           是x的定义,而不是具体的x变量。(注意访问权限的问题)也就是说,定义的是类对象,而非对

 例子:如果传递给Method对象的invoke()方法的第一个参数为null,这有着什么样的意义呢?说明该Method对

 Jdk1.4:public Object invoke(Object obj,Object[] args),即按jdk1.4的语法,需要将一个数组作

为参数传递给invoke方法时,这时它会把一个数组作为一个元素。这时如果我们要取出其中的元素,需

 要将数组中的元素通过数组一个个的取出。

抱歉!评论已关闭.