1、JDK 现在大多都用 1.6 版本了。不过 1.5 的新特性还是要弄清楚的。1.5 有哪些新特性呢静态导入 可变参数增强 for 循环 枚举 反射 javaBean 内省 beanutils 工具包 注解 泛型 类加载器 代理 线程并发库基本类型的自动拆箱和装箱静态导入:import static 语句导入一个类中的某个静态方法或所有静态方法 例 import static java.lang.math.sin;可变参数 一个方法接受的参数个数不固定 :例:System.out.println(add(3,4,5,6)-System.out.println(add(3,4,5,6,7,8)可变
2、参数的特点:只能出现在参数列表最后,位于变量类型和变量名之间前后有无空格都可以,调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数增强 for 循环for(type 变量名:集合变量名) 。 。 。注:迭代变量必须在()中定义,集合变量可以是数字或者实现了 Iterator 接口的集合类例: public static int add(int x,int.args)int sum=x;for(int arg:args)sum+=arg;return sum;基本数据的自动拆箱和装箱在大于-127,小于 128 之间的数,在定义是,在内存中取同一个对象,
3、内存自动记忆Integer i=12; Integer j=12; i=jtrue枚举就是让某个类型的变量的取值只能为若干个固定值中的一个,否则编译器报错。枚举可以让编译器在编译时就可以控制源程序中的非法值。枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象。枚举就相当于一个类,其中也可以定义构造方法,成员变量,普通方法和抽象方法。枚举元素必须在枚举体中的最开始部分。枚举元素列表的后要有分号与其他成员分隔,枚举只有一个成员时,就可以作为一种单例模式反射Class 类-对应各个类在内存中的字节码。一个类被类加载器加载到内存中,占用一片存储空间,这个空间里面的内容就是类的字节码,不同类的字节
4、码是不同的,所有他们在内存中的内容是不同的。得到各个字节码对应的实例对象 类名.class对象.getClass()Class.forName(“类名“)反射就是把 java 类中的各种成分映射成相应的 java 类。Constructor 类得到某个类的所有构造方法 例 Constructor constructors=Class.forName(“java.lang.String“).getConstructors();得到某一个构造方法 例 Constructor constructor=Class.forName(“java.lang.String“).getConstructor(S
5、tringBuffer.class)创建实例对象通常方式: String str=new String(new StringBuffer(“abc“)反射方式 String str=(String)constructor.newInstance(new StringBuffer(“abc“);Class.newInstance()方法例子:String obj=(String)Class.forName(“java.lang.String“).newInstance();该方法内部先得到默认的构造方法,然后用该构造方法创建实例对象,内部代码用到了缓存机制来保存默认构造方法的实例对象Field
6、类 代表某个类中的一个成员变量Method 类 代表某一个类中的成员方法例子:Method charAt=Class.forName(“java.lang.String“).getMethod(“charAt“,int.class)调用方法通常方式 System.out.println(str.charAt(1)反射方式 System.out.println(charAt.invoke(str,1)jdk1.4 和 jdk1.5 的 invoke 方法的区别jdk1.5:public Object invoke(Object obj,Object.args)jdk 1.4 public Obj
7、ect invoke(Object obj,Object args)按 1.4 的语法,需要将一个数组作为参数传递给 invoke 方法时,数组中的每个元素分别对应被调用方法的中一个参数所以调用charAt()的代码页可以用 jdk1.4 改写为 char.invoke(“str“,new Object1)启动 java 程序的 main 方法的参数是一个字符串数组, public static void main(String args),通过反射方式来调用这个 main 方法时,是按 1.4 语法把数组打散成若干个单独的参数。所以给 main 方法传递参数时,不能使用 mainMethod
8、.invoke(null,new String“xxx“)解决mainMethod.invoke(null,new Objectnew String“xxx“)将数组放入一个数组中打开还是一个数组mainMethod.invoke(null,(Object)new String“xxx“)把数组当做对象看待数组的反射具有相同维数和元素类型的数组属于同一个类型,即具有相同的 class 实例对象代表述职的 class 实例对象的 getSuperClass()返回的父类为 Object 类对应的 Class基本类型的一维数组可以被当做 Object 类型使用,不能当做 Object类型使用,非基
9、本类型的一维数组,既可以 Object 或者是 ObjectArray 工具类用于完成对数组的反射操作反射的作用实现框架功能注解注解相当于一种标记,加上注解就等于打上了某种标记,以后 javac 编译器、开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去做相应的事。标记可以加在包类 字段 方法 方法的参数及局部变量上。泛型没使用泛型时,只要是对象,不管是什么类型的对象,都可以存储进同一个集合中。使用泛型集合,可以将一个集合中的元素限定为一个特定类型,集合中只能存储同一个类型的对象,并且当从集合中获取一个对象时,编译器也可以知道这个对象的类型,不需要进行对对象
10、进行强制类型转换。ArrayList类定义和 ArrayList类引用中涉及如下术语:整个称为 ArrayList泛型类型ArrayList中的 E 称为类型变量或类型参数整个 ArrayList称为参数化的类型ArrayList中的 Integer 称为类型参数的实例或实际类型参数ArrayList中的念着 typeofArrayList 称为原始类型参数化类型与原始类型的兼容性:参数化类型可以引用一个原始类型的对象,编译报告警告,例如, Collection c = new Vector();原始类型可以引用一个参数化类型的对象,编译报告警告,例如, Collection c = new
11、Vector();参数化类型不考虑类型参数的继承关系:Vector v = new Vector(); /错误!Vector v = new Vector(); /也错误!在创建数组实例时,数组的元素不能使用参数化的类型,例如,下面语句有错误:Vector vectorList = new Vector10;泛型中的通配符 类型 使用 ?通配符可以引用其他各种参数化的类型,?通配符定义的变量主要用做引用。可以调用与参数化无关的方法,但不能调用与参数化有关的方法。例子: Collection a 可以与任意参数化的类型匹配,但到底匹配的是什么类型,只有以后才知道,所以,a=new ArrayList和 a=new ArrayList都可以, 但a.add(new Date()或 a.add(“abc”)都不行泛型通配符的扩展向上限定通配符:正确:Vector x = new Vector();错误:Vector x = new Vector();向下限定通配符:正确:Vector x = new Vector();错误:Vector x = new Vector();提示:无论是向上,还是下,都包括自己。