Jdk1.5新特性
1.静态倒入
所谓静态倒入就是在使用静态方法时,想省略类名而直接用类中的静态方法。
例如:
import static java.util.Collections.addAll;
在下面的程序中就可以直接应用Collections中的addAll()方法了
import static java.util.Collections.addAll;
当一个类中频繁是使用某个工具类中的一些方法时应用静态倒入吧这些方法加倒入到类中,使用起来非常方便
2.可变参数列表
可变参数就是方法可以接受个数不确定的同类型参数。应用方法例如:
public static void func(String...str){
//.....
}
该方法中的String...str,即为方法的可变参数,这个方法可以接收个数不定的字符串类型参数。
在应用可变参数列表时,要注意一下几点:
①可变参数只能出现在方法参数列表的最后一位。
public static void func(String...str, int n){
//.....
}
像这样的写法是错误的,更正如下
public static void func(int n, String...str){
//.....
}
②三个...位于类型和变量名之间
③调用带有可变参数的方法,编译器为可变参数隐式的创建一个数组,在方法体重以数组的形式访问可变参数。
3.增强for循环
从字面上理解就是对for循环进行了装饰性功能加强,常规for循环再遍历数组或集合时,需要一个变量作为循环控制指针,而在增强for循环中则不需要这个变量对循环进行控制,只要用一个变量来接收数组或指针中的内容即可。应用语法例子如下:
String []strs = {"fad","fa","adsf"};
Set<String> set = new HashSet<String>();
for(String s : strs){
System.out.println(s);
}
for(String se : set){
System.out.println(se);
}
注:增强for循环可以对数组和实现了Iterable接口的集合类进行遍历,实际上,增强for循环底层是应用了iterable的相关方法。
4.基本数据类型的自动拆箱装箱
所谓基本数据类型的装箱,就是把基本数据类型进行封装处理,将其变成与之对应的引用数据类型,
所谓拆箱,就是把被封装成引用树类型的基本数据类型转换成基本数据类型。
已下是7中基本数据类型的包装器类:
Byte,Character,Short,Integer,Longer,Flo at,Double
应用方法例如:
装箱:
int num = 10;
nteger numIn = new Integer(10);
拆箱:
Integer numIn = new Integer(10);
int nums = numIn.intValue();
这样,就把int类型数据包装成了一个引用数据类型,这是非常有用的,例如,集合中不能存储基本数据类型,有了装箱跟拆箱机制就可以在集合中间接存储基本数据类型。
另外,有一个非常有趣的现象:
Integer i1 = 23;
Integer i2 = 23;
System.out.println(i1 == i2);
结果为:true
Integer i1 = 290;
Integer i2 = 290;
System.out.println(i1 == i2);
结果为:false
Integer i1 = new Integer(3);
Integer i2 = new Integer(3);
System.out.println(i1 == i2);
结果为false
这是为什么呢?同样是整数类型的包装器类型。
这是因为Java认为 -128 ~ 127之间的数字是非常常用的,并且JVM对这个范围的数字进行了缓冲处理,原理与String类型变量差不多,对于在这个范围内的引用类型数据在JVM启动时就在内存当中创建了他们,目的在于提高程序的效率,因为这个范围的的数字实在太常用了,JVM不想总是忙着为这些数字创建对象。
但是如果是显示的进行包装,那就不一样了,显示的用new关键字对基本类型数据进行包装就如果在创建对象一样,虽然对象内的数据相同,但是毕竟是两个不同的对象,内存地址是肯定不一样的。
享元设计模式:这种把出现频率较高的数据放到共享区域的设计方式称之为
享元设计模式,这种设计模式的应用场景一般为当一个对象
较小但是要被用到很多次的时候,为了节约内存空间就会预
早创建这些对象供外部使用
5.枚举
枚举也是JDK1.5新添加的一个功能,实际上枚举就是对那些不应该被改变的数据进行封装,枚举的每一元素都是一个对象。下面通过一个例子来说明枚举的用法:
public class HelloWorld{
public static void main(String []args){
/**
* 常用方法 String name() ; Week valueOf(String enumName) ; Week[] values()
* int ordinal()
* */
Week w1 = Week.MON;
//获取当前枚举对象的名称
String name = w1.name();
//获取w1在枚举元素列表中的位置
int ord = w1.ordinal();
//获取名称为WED的枚举对象
Week value = Week.valueOf("WED");
//获取Week枚举类型中的所有元素
Week[] weeks = Week.values();
System.out.println("Name : " + name + "\n"+"Position : "
+ ord + "\n"+"Value : " + value+"\n "+"Weeks : " + weeks);
}
}
enum Week{
//定义枚举的元素,每一个元素都是一个Week
MON,TUE(2),WED,THR(3),FRI,SAT,SUN;
//定义构造函数,枚举类的构造方法必须是私有的,因为外界不能创建枚举类对象
private Week(){System.out.println("first");}
//也可以定义带参数的构造函数,在定义元素时这样调用 MON(1)
private Week(int x){ System.out.println("second");}
}
6.注解
注解正在成为一个及其强大的功能,如EJB 最新版Spring等都开始基于注解。注解相当于一种标记,在程序中添加了注解就等于为程序打上了某种标记,以后javac编译器和开发工具都可以用反射来了解各种元素上有无标记。标记可以添加在包,类,方法,字段,及局部变量上。
JDK1.5开始Java也开始提供注解功能,Java提供了三个基本注解和四个元注解:
基本注解: @Override:表示当前的方法定义将覆盖父类中的方法
@Detention:将元素标注为过时的
@SuppressWarnings:关闭不当的编译器警告
元注解: 负责注解其他的注解
@Target:标识注解可以用于什么位置(有属性ElementType)
@Retention:标识需要在什么级别保存该注解的信息(有属性
值RetentionPolicy)
@Documented:将当前注解保护在doc文档中(无属性值)
@Inherited:允许子类继承父类注解(无属性值)
下面用一个例子来展示Java中注解的基本用法:
import java.lang.annotation.*;
/**
* 自定义注解: @interface AnnoName
* */
//将SelfAnnocation注释的保存基本设置到运行时,这就可以通过反射机制读取到自定义注释的信息
@Retention(RetentionPolicy.RUNTIME)
//将注释的作用域限制成类和方法
@Target({ElementType.TYPE,ElementType.METHOD})
public @interface SelfAnnotation {
//为color指定默认值,如果应用该注释时没有给出color的值,那么也不会报错,color默认值为red
String color() default "red"; //为注解添加属性,在调用出用 属性名="属性值"的方式对其进行设置
//为注解添加数组属性
int[] arrVal() default {2,4,5};
//为注解定义枚举类型属性
EnumAnno enumVal() default EnumAnno.TWO;
//为注解添加注解属性
SelfAnnotation2 anno() default @SelfAnnotation2("binary");
}
public @interface SelfAnnotation2 {
String value();
}
enum EnumAnno{
ONE,TWO,THREE,FOUR,FIVE,SIX,SEVEN;
}
/**
* 应用自定义的注解
* */
// 设置自定义注解的属性值 注解中的注解属性
@SelfAnnotation(color = "red", arrVal = { 3, 4, 56 }, anno = @SelfAnnotation2("iphone"))
// 当arrVal只有一个值时,可以不用大括号 : arrVal = 4 也可以
public class AnnocationDemo1 {
// 因为@SelfAnnocation的作用域被设置成了类和方法,所以在类和方法前面都可以应用该注释
@SelfAnnotation
public static void main(String[] args) {
// 判断SelfAnnocation是不是一个注解,由于注解的默认保存级别在class上,会被jvm丢弃,所以isAnno一定是false
// 当SelfAnnocation的保存级别被设置成运行时时,就可以读取到SelfAnnocation的信息了
boolean isAnno = AnnocationDemo1.class
.isAnnotationPresent(SelfAnnotation.class);
if (isAnno) {
// 获取注解对象
SelfAnnotation selfAnno = AnnocationDemo1.class
.getAnnotation(SelfAnnotation.class);
// 打印注释信息
System.out.println(selfAnno.annotationType() + ", "
+ selfAnno.color() + ", " + selfAnno.arrVal().length
+ ", Name:" + selfAnno.enumVal().name()
+ ", Value:" + selfAnno.anno().value());
}
}
}