今天开始上就业班,为期4个月
JDK 5.0新特性
历史性的东西咱们也需要了解一下
1995 java问世 1.0版本
里程碑的升级:1.2版本
2005 JDK 5.0
下面介绍新特性
1.静态导入
Import static 包名.类名.静态属性 or 静态方法 or *;
eg:
静态属性
Import static java.lang.System.out;
导入此包后,以后我们打印输出语句就可以写成:
out.println("Hello, Java!!");
静态方法
Import static java.lang.Math.*;
导入Math类的所有静态方法
此时不需要类名.静态方法名,直接静态方法名调用即可
2.自动装箱和拆箱
JDK5.0的语法允许开发人员把一个基本数据类型直接赋给对应的包装类变量, 或者赋给 Object 类型的变量,这个过程称之为自动装箱
自动拆箱与自动装箱与之相反,即把包装类对象直接赋给一个对应的基本类型变量
eg:
自动装箱
int x = 10;
Integer num = x;
java虚拟机会自动把x转成一个对象,并使用前面定义的num变量指向这个对象
List list = new ArrayList();
list.add(Object obj);可以写成:list.add(1);
自动装箱,将基本数据类型1转成Object对象
自动拆箱
Integer i = new Integer(10);
int y = i;
java虚拟机会自动去取i对象的数据,并赋给基本数据类型的变量y
3.增强for循环
这个特性在基础班已经用到很多次了,当我们遍历数组或者集合时,使用增强for很方便
但仍需要注意一些问题;
(1)增强for循环只适用于数组和实现Iterator接口的集合类
(2)使用增强for循环不能修改数组或集合中的元素
其实这个不难理解,因为使用增强for时没有涉及到角标问题,我们仅仅是用一个类型相同的变量num记住了每一个元素的内容
当我们改变num的内容时,并不能改变数组或集合中元素的内容
下面分别就数组和集合来说明一下这个问题
int[] arr = new int[5];//没有定义每个元素的值,则默认为0
for(int num : arr)
{
num = 1;
}
System.out.println(arr[0]);
表面上看是改变了数组中的每个元素,都为1,其实我们只是改变了"用来记录每个元素内容"的变量而已
运行结果为:0
ArrayList<String> al = new ArrayList<String>();
al.add("abc");
for(String str : al)
{
str = "cba";
}
System.out.println(al.get(0));//打印出集合中的第一个元素
同数组的结论一样,运行结果为:abc
4.可变参数
测试JDK中具有可变参数的类Arrays.asList()方法。分别传多个参、传数组,又传参又传数组的情况。
从JDK 5开始, Java 允许为方法定义长度可变的参数。
eg:
public static void foo(int … num)
{
//求和
int count = 0;
for(int sum : num)//可以将可变参数看做是一个数组
{
count += sum;
}
}
然后在main方法中调用:foo(1,2,3,4,5);运行结果:15
咱们来认识一下Arrays类中的asList方法
List list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);//Returns a fixed-size list backed by the specified array.
System.out.println(list);
运行结果为:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
需要注意的问题:
(1)调用可变参数的方法时, 编译器将自动创建一个数组保存传递给方法的可变参数,
因此,我们可以在方法体中以数组的形式访问可变参数
(2)可变参数只能处于参数列表的最后, 并且一个方法最多只能有一个长度可变的参数
如下为Overload可变参数:
public static void run(int ... num){}
public static void run(int i, int j, int ... num){}
省略号必须为3点...
5.枚举
JDK 5新增的 enum 关键字用于定义一个枚举类,有如下特性:
(1)枚举类也是一种特殊形式的Java类
(2)枚举类中声明的每一个枚举值代表枚举类的一个实例对象
(3)与java中的普通类一样,在声明枚举类时,也可以声明属性、方法和构造函数,但枚举类的构造函数必须为私有的
enum WeekDay
{
//此处声明的每一个枚举值都代表此枚举类的一个实例对象
MON,TUE,WED,THU,FRI,SAT,SUN;
//默认无参构造函数可以不写,但我们必须知道这个隐藏的无参构造函数也是private的,
//即枚举类就不能new对象,一旦public构造函数,编译器就会报错
private WeekDay(){}
}
在来看另一种类型的枚举值
enum WeekDay
{
private String dayName;
private WeekDay(String dayName)
{
this.dayName = dayName;
}
//当我们显式的创建构造函数时,也必须private,这时定义枚举值就有所区别
MON("星期一"),
TUE("星期二"),
... ;
//也可以在枚举类中定义方法
public String toLocaleString()
{
return this.dayName;//这里写this貌似有点多余,但当我们需要在此方法中传入一个相同变量名时,this就很有必要了
}
}
下面我们在main方法中来使用一下这个枚举类,main方法就省略了
String wd = WeekDay.MON.toLocaleString();
枚举类中的枚举值就相当于一个实例对象,但我们不能直接拿来用,他们等价于private static final
(4)枚举类也可以实现接口、或继承抽象类
interface Info
{
void getInfo();
}
//接口中定义的方法默认public,定义的成员变量默认为public static final
enum WeekDay implements Info
{
//定义枚举值时可以实现接口中的方法
Mon, Tue, Wed;
public void getInfo()
{
}
/*也可以定义成匿名内部类,每个枚举类的实例对象即枚举值都必须实现接口中的方法
Mon()
{
public void getInfo()
{
}
},
Tue()
{
public void getInfo()
{
}
},
Wed()
{
public void getInfo()
{
}
};
*/
}
以下一些特性可以了解一下
(5)JDK5中扩展了swith语句,它除了可以接收int, byte, char, short外,还可以接收一个枚举类型
(6)若枚举类只有一个枚举值,则可以当作单态设计模式使用
今天就到这,明天总结一下泛型及反射