JDK1.5的新特性。
一、StaticImport
静态导入:导入一个类的静态方法。import static …
二、可变参数
特点:1、只能出现在参数列表的最后面
2、调用可变参数方法时,编译器为可变参数隐含创建一个数组,方法中以数组的形式访问
class VariableParameter
{
public static void main(String[] args)
{
System.out.println(add(1,2,3));//=6;
System.out.println(add(1,2,3,4));//=10;
}
public static int add(int x,int ...args)//...只能出现在参数列表的最后面
{
int sum =x;
for(int i =0;i<args.length;i++)
{
sum+=args[i];
}
return sum;
}
}
三、增强for循环
for(type 变量名 : 集合变量名){}
注意:迭代变量必须在()中定义。
集合变量可以是数组或者是实现iterable接口的集合类。
四、基本数据类型的自动装箱与拆箱
享元模式 flyweigth
如果很多很小的对象,它们有很多相同的东西,那么可以把它们变成一个对象,不同的东 西变成外部的属性,作为方法的参数传入。
五、枚举
枚举就是让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会自动报错,枚 举可以让编译器在编译时就 可以控制源程序中填写的非法值,普遍变量的方式在开发阶段无法实 现这一目标
方法摘要:
String name();返回此枚举常量的名称,在其枚举声明中对其进行声明。
static int ordinal();返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零) static char values();返回一个数组
/*
枚举代码演示
*/
class EnumTest
{
public static void main(String[] args)
{
//WeekDay weekday = WeekDay.nextDay();
//System.out.println(weekday);
}
public enum WeekDay
{
SUN(1),MON,TUE,WED,THI,FRI,STA;//必须在第一行.。当调用有参数的构造函数时在后面加(int),表示调用的几个参数的构造函数
private WeekDay()//构造方法必须是private
{
System.out.println("无参数");
}
private WeekDay(int day)
{
System.out.println("有参数");
}
}
public enum TrafficLamp
{
RED(30)//内部类 子类实现父类的抽象方法。
{
public TrafficLamp nextLamp()
{
return GREEN;
}
},
YELLOW(5)
{
public TrafficLamp nextLamp()
{
return RED;
}
},
GREEN(45)
{
public TrafficLamp nextLamp()
{
return YELLOW;
}
};
public abstract TrafficLamp nextLamp();
public int time;
private TrafficLamp(int time)
{
this.time = time;
}
}
}
六、反射-->Class类
反射不是JDK1.5的新特性。从1.2就有了。
Java程序中的各个Java类属于同一事物,描述这类事物的Java类名就是Class
人---->>>Person
Java类--->>Class
如何得到各个字节码对应的实例对象(Class类型)
(1)类名.class 例如:String.class
(2)对象.getClass 例如:new Parson().getClass();
(3)Class.forName("类名"); 例如:Class.forName("java.lang.String");
方法摘要:
boolean isArray() :判定此 Class 对象是否表示一个数组类。
boolean isPrimitive() :判定指定的 Class 对象是否表示一个基本类型。
String getName() 以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基 本类型或 void)名称。
反射
反射就是把Java类中的各种成分映射成相应的java类。
Constructor类
代表某一个类中的构造方法
得到某个类中所有的构造方法:
Constructor [] constructor = Class.forName("java.lang.String").getConstructor
得到某一个构造方法:
Constructor constructor =
Class.forName("java.lang.String").getConstructor(StringBuffer.class)
//获得方法时要用到类型
创建实例对象:
通常方式:String str = new String(new StringBuffer("abc"));
反射方式:String str =
(String)constructor.newInstance(new StringBuffer("abc"));
Class.newInstance()方法:
该方法内部先得到默认的构造方法,然后用该构造方法创建实例对象。
用到了缓冲机制来保存默认构造方法的实例对象
Method类
代表某一个类中的成员方法
得到一个成员方法
Method charAt = String.class.getMethod("charAt",int.class);
调用方法
charAt.invoke(str,1);//invoke("对象",参数);
如果invoke();方法的第一个参数为null,则说明是静态方法
数组的反射
具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象
代表数组的Class实例对象的getSuperClass()方法返回的父类为Object对应的Class
基本类型的一维数组可以被当作Object类型使用,不能当作Object []使用;非基本类型的一维数组,既可以当作Object类型使用,又可以当作Object [] 使用
内省--->JavaBean
JavaBean是一种特殊的Java类,主要用于传递数据信息,这种Java类的的方法这样用于访问私有字 段且方法符合某种命名规则
如果在两个模块之间传递多个信息,可以将这些信息封装到一个JavaBean中,这种JavaBean的实例对象通常称为值对象(Vlaue Object)。这些信息在类中私有字段存储,如果读取或设置这些字段的值,将需要通过一些相应的方法来访问。JavaBean的属性是根据其中的setter和getter方法来确定的,不是根据其中的成员变量。
一个类被当作JavaBean来使用时,JavaBean的属性是根据方法名推断出来的。
BeanUtils工具包
静态方法
BeanUtil.setProperty("对象","成员名","设置内容");设置成员属性
BeanUtil.getProperty("对象","成员名");得到成员属性
注解
JDK 1.5的新特性
@Depercated
用 @Deprecated 注释的程序元素,不鼓励程序员使用这样的元素,通常是因为它很危险 或存在更好的选择。在使用不被赞成的程序元素或在不被赞成的代码中执行重写时,编译 器会发出警告。
@Override
表示一个方法声明打算重写超类中的另一个方法声明。如果方法利用此注释类型进行注解 但没有重写超类方法,则编译器会生成一条错误消息。
@SuppressWarnings
指示应该在注释元素(以及包含在该注释元素中的所有程序元素)中取消显示指定的编译 器警告。注意,在给定元素中取消显示的警告集是所有包含元素中取消显示的警告的超集 。例如,如果注释一个类来取消显示某个警告,同时注释一个方法来取消显示另一个警告 ,那么将在此方法中同时取消显示这两个警告。
根据风格不同,程序员应该始终在最里层的嵌套元素上使用此注释,在那里使用才有效。 如果要在特定的方法中取消显示某个警告,则应该注释该方法而不是注释它的类。
自定义注解及应用
定义一个注解类:
public @interface MyAnnotation{}//
把注解类加到某个类:
@MyAnnotation
public class MyAnnotationTest{}
通过反射测试MyAnnotation是否有MyAnnotation
代码演示
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation
{
String color();//抽象的 default(默认值)
}
@MyAnnotation(color="red")//增加注解的属性(赋值)
class MyAnnotationTest
{
public static void main(String[] args)
{
if(MyAnnotationTest.class.isAnnotationPresent(MyAnnotation.class))
{
MyAnnotation myannotation = (MyAnnotation)MyAnnotationTest.class.getAnnotation(MyAnnotation.class);
System.out.println(myannotation.color());//通过方法调用
}
}
}
泛型
JDK1.5的新特性
泛型通配符 ?
使用通配符?可以使用其他各种参数话类型,通配符定义的变量主要用作引用,可以调用与参数无 关的方法,不能调用与参数有关的方法。
向上限定: Vector<? extends Number>= new Vecotor<Integer>();
向下限定: Vector<? super Integer>= new Vecotor<Number>()
提示,限定通配符包括自己。
泛型代码演示
import java.util.*;
class GenericTest
{
public static void main(String[] args)
{
HashMap<String,Integer> maps = new HashMap<String,Integer>();
maps.put("java01",1);
maps.put("java02",2);
maps.put("java03",3);
//Map集合不能迭代
Set<Map.Entry<String,Integer>> entrySet = maps.entrySet();
for(Map.Entry<String,Integer> entry : entrySet)
{
System.out.println(entry.getKey()+"="+entry.getValue());
}
}
}
泛型可以定义在类上:
public class Generic <E>{}
类上定义的泛型,不能使用在静态方法
泛型也可以定义在方法上:
public <E> void generic(){}