时间:2016-11-5 12:03
JDK5.0新特性
泛型、枚举、静态导入、自动拆装箱、增强for循环、可变参数1、Junit单元测试 测试的对象是类中的一个方法。 junit不属于JavaSE,要想使用需要导入相应的jar包。 首先junit有不同的版本。 单元测试方法命名规则: 必须是public 不能有返回值 不能有参数 运行测试方法时,需要在方法上面加上一个注释: @Test //表示这是一个测试方法 @Ignore //表示该方法不进行单元测试 @Before //在每一个单元测试方法之前运行(如果有多个测试方法,都会先执行该方法) @After //在每一个单元测试方法之后运行(如果有多个测试方法,都会后执行该方法) //测试方法
@Test
public void test01()
{
JunitDemo test = new JunitDemo();
test.test01(2, 3);
} 当出现绿色条时,表示方法测试成功。 当出现红色条时,表示方法测试失败。
要想运行单个测试方法,需要选中方法名之后再运行。 断言: Assert.assertEquals(expected, actual); expected:测试期望值 actual:方法运行的实际值 当期望值和实际值相同,则单元测试通过,否则失败。2、泛型 在JDK5.0以前,对象保存到集合中就会失去其特性,取出时需要程序员手动进行类型的强制转换,这样不可避免会引发程序的一系列安全性问题。 泛型擦除: 泛型只是出现在源代码阶段,当源代码编译之后,泛型就不存在了。 定义泛型类实现数组倒置:
public class EnumDemo {
public static void main(String[] args)
{
Short arr[] = {1,2,3,4,5,6};
System.out.println("颠倒前:");
for(int i : arr)
{
System.out.print(i + "\t");
}
arr = new Demo<Short>().reverse(arr);
System.out.println("\n颠倒后:");
for(int i : arr)
{
System.out.print(i + "\t");
}
}
}
class Demo<T>
{
public T[] reverse(T [] arr){
for(int i = 0, j = arr.length-1; i < arr.length/2; i++, j--)
{
T temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
return arr;
}
}
3、枚举
什么是枚举? 只能在一定的范围内取值,这个值只能是范围内的任意一个值。 例如周一到周日。
为什么需要枚举?
一些方法在运行时,它需要的数据不能是任意的,而必须是一定范围内的数值,此类问题在JDK5.0以前采用自定义带有枚举功能的类来解决,在JDK5.0以后可以直接使用枚举予以解决。 JDK5.0新增的enum关键字用于定义一个枚举类: enum Week {
Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday
} 枚举类案例: 有参构造方法枚举类型 需要在每个实例上都写上参数:Week(String s) {} → Sunday("") 带有抽象方法的枚举类型举例 在枚举的每个实例中都要重写这个抽象方法。 练习: 编写一个关于星期几的枚举类(Week),要求: 枚举值:Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday 该枚举类有一个方法,调用该方法返回中文格式的星期数。
4、枚举API String name() 返回枚举的名称。 int ordinal() 返回枚举的下标,下标从0开始。 static Enum valueOf(Class enumType, String name) 返回枚举的对象。 自定义的枚举类,在编译阶段自动生成两个方法: Enum valueof(String name) 获取枚举对象。 Enum[] values() 获得所有枚举对象的数组。
5、静态导入 可以在代码中,直接使用静态导入方式,导入静态方法或者常量。 6、自动拆装箱 装箱: 把基本的数据类型转换成包装类。 拆箱: 把包装类转换成基本的数据类型。 自动装箱: Integer i = 10; 自动拆箱: int j = i; public static void main(String[] args)
{
method(1);
}
public static void method(int i)
{
System.out.println("int"); //输出int,JDK的向下兼容特性。
}
public static void method(Integer i)
{
System.out.println("Integer");
}
7、增强for循环 引入增强for循环的原因:替代Iterator for/in语句的适用范围: 遍历数组 遍历实现Iterable接口的集合类 增强for循环底层实现也是迭代器,可以通过class文件查看。 8、可变参数 如果说实现的多个方法,这些方法中逻辑基本相同,唯一不同的是传递参数的个数,那么可以使用可变参数。 可变参数应用场景: 实现两个数的相加,再实现三个数的相加,再实现四个数的相加....... public class EnumDemo {
public static void main(String[] args)
{
add(1,2);
add(1,2,3);
add(1,2,3,4);
}
public static void add(int...arguments)
{
//arguments可以理解为一个数组,这个数组用于存储传递的参数,相当于JS中的arguments
int sum = 0;
for(int i = 0; i < arguments.length; i++)
{
sum += arguments[i];
}
System.out.println(sum);
}
}
注意: (1)可变参数需要写在方法的参数列表中,不能单独定义。 (2)在方法的参数列表中只能有一个可变参数。 (3)如果有其他参数,则可变参数必须放在参数列表的最后。