jdk 5.0新特性
jdk5.0 中的新特性
泛型,自动拆装箱,增强for循环,枚举,可变参数
1,自动拆装箱
装箱:把基本的数据类型转换成对应的包装类
拆箱:把包装类转换成对应的基本数据类型
首先看看装箱
Integer i =15; 这样的写法,在jdk5.0之前是不能使用
拆箱:
int m = i;
在jdk5.0之前是这样实现拆装箱的
装箱:Integer i = new Integer(2);
拆箱: int m = i.intValue();
2,泛型:
泛型一般使用在集合上面
比如我们把字符串类型的值放入到集合里面,就失去了本身的类型,变成了object类型了,需要强制转换,很容易出现
类型转换的错误
注意,泛型里面不能放基本数据类型,只能是对象,写基本的数据类型应该写相对应的包装类
泛型可以定义在类上和方法上
例如: public class Demo<T>(){
}
这样,T就可以在类中使用了
使用在方法中: 如果方法的逻辑相同,只是数据类型不同,这个时候使用泛型方法
public static <T> void test(T aa){
方法体里面就可以使用这个类型
}
3,可变参数
当我们现在实现3个数相加,4个数相加
当一个方法里面的逻辑基本相同,唯一不同的是传递参数的个数,那么就可以使用可变参数来实现
public static void main(String[] args){
//实现三个数的相加
sum(1,2,3);
//如果现在要实现4个数的相加
sum(1,2,3,4);
那么怎么写?从新写一个方法吗?
这个时候 可变参数就起作用了
sumCommon(1,2,3);
sumCommon(1,2,3,4);
}
public void sumCommon(int... nums){
int sum = 0;
for( int i =0;i<nums.length;i++){
sum+= nums[i]
}
}
public static void sum(int a ,int b ,int c){
int sum = 0;
sum = a+b+c;
}
注意的地方:
(1)可变参数西需要写在方法的参数列表中,不能单独来定义
(2)在方法的参数列表中,只能有一个可变参数
(3)方法的参数列表中,可变参数必须放在参数的最后
add1(int...nums,int a )这种写法是错了
add2(int a , int...nums)这种写法就是可以的
4,反射
首先,我们在获取class的时候有三种方式
例如:
public class Test(){
public void test(){
//第一种
Test.class
//第二种 对象.getClass()
this.getClass()
//第三种就是反射了
Class.forName();
}
}
下面我们来看看反射使用的地方 反射一般使用在我们的框架中,一般应用到xml配置文件的地方都使用了反射
利用反射可以获取类中的所有内容:属性,构造方法,普通方法
获取属性使用一个类 Filed
获取构造方法:Constructor
普通方法通过:Method
操作无参数的构造方法
public void test(){
//得到class
Class clazz = Class.forName("类路径");
获取类的实例 假设有个Person类
Person p = class.newInstance();
p.serName("xxx");
}
操作有参数的构造方法:
public void test1(){
//得到class
Class clazz = Class.forName("类路径");
获取类的实例 假设有个Person类 里面有 string Name String sex
//传递的时候有参数的构造方法里面的参数类型
Constructor cs = clazz.getConstructor(String.class,String.class);
cs.newInstance("zhangsan","nan");
}
//使用反射来操作属性
public void test3(){
Class clazz = Class.forName("类路径");
Person p = clazz.newInstance();
获取类的实例 假设有个Person类 里面有 string Name String sex
//得到name属性
clazz.getDeclareFields()//获取所有
Field f1 = clazz.getDeclaredField("name");
//表示可以操作可以 私有属性
f1.setAccessible(true);
//设置name的值
f1.set(p,""zhangsan);
}
操作普通方法
Method
public void test(){
Class clazz = Class.forName("类路径");
Person p = clazz.newInstance();
//第一个参数,方法名称 第二个参数,通过方法设置的值的class
Method m1 = c4.getDeclaredMethod("setName",String.class);
//如果操作的是私有的方法
m1.setAccessible(true);
//操作方法设置值
m1.invoke(p,"zhangsan");
//当我们操作的方法是静态的方法,类名.方法名 操作方法的时候不需要实例
在invoke方法的第一个参数里面直接写一个空
m1.invoke(null,"zhangsan");
}
5,增强for循环
我们在循环一个 List的时候,在没有jdk5.0之前通常是使用
List<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
(1) for(int i =0;i<list.size();i++){
list.get(i);
}
(2) 迭代器来遍历
Iterator<String> it = list.iterator();
while(it.hasNext){
String a = it.next()
}
在jdk5.0后就可以使用增强for 了
(3) for(String str : list){
System.out.println(str);
}