时间:2021-09-14 19:41:25


JDK5中新增了很多新的java特性,利用这些新特性可以帮助开发人员编写出更加高效、清晰,安全的代码,新的技术的出现就是为了解决老的问题,Java语言随着自身的不断发展,对那些不利于提高开发率的技术进行了改进。比如下面的几个新特性,哪一个特性的提出,都是对现实情况的分析而得出的。主要的一些新特性简要介绍如下:


1.静态导入(import static)

import语句可以导入一个类或是某个包中的所有类。

import static 语句可以导入一个类中的某个静态方法或是所有静态方法。

例如:

Math类提供了很多于数学运算的静态方法,通常情况下我们是以Math.abs();这样的方式来进行调用函数的。但是我们可不可以只写出adb();

在JDK1.5之后,可以使用import static 语句导入一个类中的某个静态方法或是所有静态方法。这是JDK1.5的新特性之一。

例如:

import static java.lang.Math.abs;就可以直接写一个abs();函数。

import static java.lang.Math.*; 就可以直接调用Math类中的所有静态方法。


2.For-Each循环(增强型for循环)

JDK1.5中,For-Each循环的加入简化了集合的遍历。假设我们要遍历一个集合对其中的元素进行一些处理。典型的代码为:

<java——知识扩充(一) JDK1.5的新特性>


3.自动装包/拆包(Autoboxing/unboxing)

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


4.枚举(Enums)

JDK1.5加入了一个全新类型的“类”-枚举类型。为此JDK1.5引入了一个新关键字enmu. 我们可以这样来定义一个枚举类型。如下:

<java——知识扩充(一) JDK1.5的新特性>

之后,可以这样使用:

Gender gender = Gender.male;

也可以对枚举进行遍历,枚举类型提供了两个静态方法values()和valueOf():

<java——知识扩充(一) JDK1.5的新特性>

 

5.可变参数(Varargs)

可变参数使程序员可以声明一个接受可变数目参数的方法(类似于多个方法重载,只不过是可变参数提供一个方法实现多个方法的重载,变得只是方法其中的参数)。

注意:可变参数必须是函数声明中的最后一个参数。

比如:我们编写一个简单的打印方法,以传统的方式实现方法重载:

<java——知识扩充(一) JDK1.5的新特性>

 

下面使用可变参数来实现这些方法的重载:

<java——知识扩充(一) JDK1.5的新特性>

调用方法:

Write("abc",123,new ArrayList());  // 当然其中的参数可以是任意类型,任意多个

 // 这就很方便的实现了方法重载 

输出:

java.lang.String
     java.lang.Integer
     java.util.ArrayList


6.泛型(Generic)

在JDK1.5之前,在Java集合容器中(如:List)可以讲任何类型的对象加入到其中,此时被加入的对象被视为Object来看待。当从集合容器取出对象时,需要程序员自行保证对象类型的强制转换。如下:

<java——知识扩充(一) JDK1.5的新特性>

这段代码中很显然List对象中的类型不匹配,但在JDK1.5之前会编译通过,运行时才会报错,这样在开发过程中很不好。所以JDK1.5引入了泛型(Generic)的概念。在看下面的代码:

<java——知识扩充(一) JDK1.5的新特性>

    泛型的引入在很大程度上避免了程序员自行保证集合容器中存取数据的强制转换。


7.反射

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

Class类

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

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

类名.class

对象.getClass()

Class.forName(“类名”)

总之,只要是在源程序中出现的类型,都有各自的Class实例对象,例如,int.class,int[].class,oid.class…

Constructor类

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

得到某个类所有的构造方法,例:

Constructor [] constructors= Class.forName("java.lang.String").getConstructors();

得到某一个构造方法,例:        

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

(StringBuffer.class);

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

String str = (String)constructor.newInstance(“abc”);

Class类的newInstance()方法也可创建类的实例,其内部工作原理是先得无参的构造方法,再用构造方法创建实例对象。

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

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

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

Field类

Field类代表某个类中的一个成员变量

问题:得到的Field对象是对应到类上面的成员变量,还是对应到对象上的成员变量?类只有一个,而该类的实例对象有多个,如果是与对象关联,那关联的是哪个对象呢?所以字段fieldX 代表的是x的定义,而不是具体的x变量。(注意访问权限的问题)也就是说,定义的是类对象,而非对象对象,当我们需要对其操作的时候,需要确定是那个具体的对象。

Method类 

Method类代表某个类中的一个成员方法得到类中的某一个方法:

例子:

Method charAt = Class.forName("java.lang.String").getMethod("charAt", int.class);

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

jdk1.4和jdk1.5的invoke方法的区别:

Jdk1.5:public Object invoke(Object obj,Object... args)

Jdk1.4:public Object invoke(Object obj,Object[] args),即按jdk1.4的语法,需要将一个数组作为参数传递给invoke方法时,这时它会把一个数组作为一个元素。这时如果我们要取出其中的元素,需要将数组中的元素通过数组一个个的取出。