jdk5.0的一些新特性(1)

在此记录我学习的笔记,方便以后查阅


以下简述了jdk5.0的一些新特性,还没有例举完


静态导入:
import static +包(好比绝对路径和相对路径的问题)
例:import static java.lang.System.out;
//调用打印函数则可以这样调用
out.println("hello");


自动装箱:
可以把一个基本数据类型直接赋给对应的包装类
例:Integer i=1;//实际上Integer i=new Integer(1);


自动拆箱:
可以把一个包装类直接赋给对应的基本数据类型
例:int j=i;//把对象i转换为基本数据类型


增强for循环:
即for each循环,常用在没有iterator接口的类(例如map集合)
注意:增强for只是取数据,不能通过其改动原来的数据。


可变参数:
可变参数好比数组,以"..."三个点标识(例子int ...nums相当于nums[]数组)。
注意:public void sum(int ...nums,int x)这样不行,
public void sum(int x,int ...nums)可行。 


枚举类:
若需要的数据不能是任意的,在jdk5之前采用自定义类来解决现在采用枚举。
用enum关键字定义一个枚举。
枚举类也是java特殊的类。
其中声明的每一个枚举值代表枚举类的一个实例对象。
在枚举类中可以声明属性和写构造函数和方法,也可以实现接口、或继承抽象类。
枚举类的构造函数必须为私有的(若为公有则可以允许其他用户实例化对象,违背设计原则--不能任意)。
switch可以接收一个枚举类型。若枚举类只有一个枚举值,可以当做单态设计模式使用。
例:enum Score{
A("优"),B("良"),C("不合格"),; //相当于new了对象
private value;
private Score(string value){this.value=value;}
public String getValue(){return this.value;}
}
System.out.println(Score.A);


枚举也可以带抽象方法,当用户需要返回的不是一种值的时候需要用到抽象方法。

例:enum Score{
//既然有抽象方法,则需要实现
A("优"){
public String getOtherValue(){
return "90-100";
}
},
B("良"){
public String getOtherValue(){
return "80-90";
}
},
C("不合格"){
public String getOtherValue(){
return "60-80";
}
},; 
private value;
private Score(string value){this.value=value;}
public String getValue(){return this.value;}
//抽象方法,提供获得其他类型的值
public abstract String getOtherValue();
}
System.out.println(Score.A.getOtherValue);

枚举类继承java.lang.Enum类,可以调用其父类的方法。values()方法用于遍历,jdk文档中查不到。




*反射reflect(框架):
一个类有多个组成部分,例如:成员变量,方法,构造方法等。反射就是加载类,并解剖出类的各个组成部分。
1、加载类,获得类的字节码:
调用Class类的静态方法forName(String name),参数传入包名.类名。例: Class clazz = Class.forName("包名.类名")
其他方式: Class clazz1 = new 类名().getClass()
Class clazz2 = 类名.class;


2、解剖出类的各个组成部分:
反射的构造函数:getConstructor方法,私有即用getDeclareConstructor
反射类的方法:getMethod方法,私有即用getDeclareMethod
反射类的字段:getField方法,私有即用getDecalareField

*内省(Introspector):
开发框架时,经常需要使用java对象的属性来封装程序的数据,每次都需要使用反射来操作比较麻烦,内省专门用于操作java对象(javabean)的属性


第一种得到所有属性:
//拿到属性
BeanInfo info = Introspector.getBeanInfo(类.class);
//拿到属性描述器数组
PropertyDescriptor[] pds = info.getPropertyDescriprots();


第二种操纵指定属性:
//通过属性描述器的构造函数获得属性
PropertyDescriptor pd = new PropertyDescriptor("类的属性名",类.class);
//获得属性的写方法
Method method = pd.getWriteMethod();
//pd.getReadMethod(); 获得属性的得方法
//启动该方法
method.invoke(对象,参数);


*使用beanUtils操作javabean的属性(常用,apache开发的,需要导入第三方相应jar包,导入后Build Path)
调用BeanUtils.setProperty(对象,属性名,数据)方法来写字段,该方法可以自动转换基本数据类型。 

可以给beanutils注册转换器:ConvertUtils.register(Converter converter,Class clazz);只支持String类型的转换。

Converter类需要实现抽象方法public Object convert(Class type,Object value){};value参数为用户传入的数据。
可以用map集合中的值填充属性,BeanUtils.populate(对象,map)方法


泛型:
对象保存到集合中会变为Object类,避免手工进行类型的强制转换可以使用泛型
例:
List<String> list = new ArrayList<String>();代表list集合中只存String类型。泛型必须是引用类型,不能是基本类型

泛型是javac编译器使用的,为了限定集合的输入类型。编译完成后生成的class文件中不宰带有泛型,这个过程称为“擦除”。


自定义泛型:
自定义泛型方法:public <类型参数变量> 关键字 函数名<类型参数变量>。
自定义泛型类:public class 类名<类型参数变量>,这里的类型参数变量作用在整个类。

猜你喜欢

转载自blog.csdn.net/it______rookie/article/details/70216930