程序员学习 jdk5新特性

来源:互联网 发布:sql 判断身份证 编辑:程序博客网 时间:2024/05/22 13:00



枚举
  JDK5版本加了很多新特性,可以说是java一个革命性的改变,比如说以前被java语言舍弃掉的枚举类型又加入到了java语言中来,下面,本人就以对enum粗浅的认识来做一个归纳和探究。
    没有enum之前其实也可以用普通的类实现枚举,但比较麻烦和不好理解,比如要对一周的周一到周日做个类的描述,可以写一下代码:
public abstract class WeekDay1 {
private WeekDay1(){}
public final static WeekDay1 SUN=new WeekDay1(){
public WeekDay1 nextDay(){
return MON;
}
};
public final static WeekDay1 MON=new WeekDay1(){
public WeekDay1 nextDay(){
return SUN;
}
};
public abstract WeekDay1 nextDay();
public String toString(){
if(this==SUN){
return "SUN";
}else{
return "MON";
}
}
}    
如果使用那个枚举会很简单,下面介绍枚举
2,枚举类型的使用
    这里实现了本类的实例对象的下一个对象是谁,只用了MON,SUN两个值来举例说明,如果是多个值则会变得更加复杂,如果用枚举类型来设计的话会变得异常简单。
 
 
    新建一个枚举类型
public enum WeekDay {SUN, MON, TUE, WED, THI, FRI, SAT}   
     
WeekDay w1 = WeekDay.MON;
常用方法:w1.name():返回此枚举对象的名字;w1.ordinal():返回此对象在枚举中的次     序位置(从0开始);
 
  WeekDay.valueOf(String):根据字符串得到相应的枚举对象;
  WeekDay.values():得到包含所有枚举对象的枚举数组;可供遍历操作;
枚举就相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象方法。
 
 为枚举类型添加构造函数 
 
  构造函数必须位于成员列表后面,并且构造函数必须为私有的;
  当创建了一个有参数的构造函数时若想使枚举成员以带参数的构造函数创建,则需要在成员名称后面加上(参数);
    例如: 
   public enum WeekDay {
             SUN(1), MON, TUE, WED, THI, FRI, SAT;
                 private WeekDay(){}
                 private WeekDay(int i) {}
         } 
 
带有抽象方法的枚举类型:
先给枚举类型添加抽象方法;然后将每一个枚举对象转变为一个实现了这个抽象方法的枚举类型的子类的对象,即后面加上{},里面添加抽象方法的具体实现
  public enum TrafficLamp{
         RED(30){
             public TrafficLamp nextLamp(){
                 return GREEN;
                 
             }
         },
         GREEN(45){
             public TrafficLamp nextLamp(){
                 return YELLOW;
                 
             }            
         },
         YELLOW(5){
             public TrafficLamp nextLamp(){
                 return RED;
                 
             }
         };
         
         private TrafficLamp(int time){ 
             this.time = time;
             }
         private int time;
         public abstract TrafficLamp nextLamp();
     }
 
· 
 自动装箱拆箱


·动装箱和拆箱是JDK1.5提供的新特性,大致是由编译器自动帮助完成基本类型和基本类型的包装类之间的转换
自动装箱和拆箱是由编译器帮助完成从基本数据类型和基本数据类型的包装类之间的转换。
 ①基本数据类型:int,long,double,float,boolean,char,byte,short
 ②基本数据类型包装类:Integet,Long,Double,Float,Boolean,Character,Byte,Short
为什么要自动装箱和拆箱
包装类是类,是对象,而基本类型是有值的“变量”,再细化一点,就是包装类的实例(对象)创建在堆上,而基本类型创建在栈上,这是JAVA为了程序的速度考虑做出的优化,那么既然是创建在栈上,所以基本类型都有大小的规定(每种基本类型所占的字节是一定的)。
在JDK1.5之前,我们要实现基本类型和包装类之间的转换,大多是通过包装类提供的方法,Integer i = Integer.valueOf(5)或者int j = i.intValue()来做互相转换的。JDK1.5之后,编译器会在我们做赋值操作(这里所说的赋值操作不包括构造函数,我们后面会讲)的时候帮我们自动完成基本类型和包装类之间的相互转换。
上面我们所说的赋值操作,基本上可以分为两种情况,一种是显式赋值,另一种是隐式赋值:
显式赋值,我们可以理解为有赋值符号出现的情况,比如,Integer i = 11;这里编译器会自动的帮你完成把11这个int的基本类型装箱成包装类实例的工作,这样就不用我们再手动的转换了。
隐式赋值,就是没有复制符号出现的情况,这点我们很多人经常忽略,比如方法调用时候的参数传递,比如我们有一个接受Integer类型参数的方法(void method(Integer i)),我们在调用的时候可以直接传递一个基本类型的实参进去(method(5)),这时候编译器会自动的将我们传递进去的实参装箱成包装类,从而完成对方法的调用。很简单的一个过程,里面的原理却不简单,这是因为,方法调用的时候,在内存中的栈上,首先会为方法的形参创建内存区域,然后将我们传递进去的实参赋值给形参,看到没,就是在这时,发生了赋值操作,才会让编译器完成装箱操作。当然,方法执行完后,栈上有关形参的内存区域会被回收。
最后有一个值得注意的地方,就是上面我们提到的显示赋值的情况下,比如Integer i = 11的情况,实际上在源码中是调用到了Integer的静态方法valueOf(),在这一块,java的设计者采用了cache pool的设计模式,在Integer这个类里面有一个长度为256的静态Integer数组,里面存储了从-128到127的Integer对象,当我们传递进去的参数在这个范围之内时,这个方法会返回该数据中实现保存的Integer对象实例,只有超过该范围时,才会返回new出来的Integer对象实例。
如:
//在-128~127 之外的数
 Integer i1 =200;  
 Integer i2 =200;          
 System.out.println("i1==i2: "+(i1==i2));                   
 // 在-128~127 之内的数
 Integer i3 =100;  
 Integer i4 =100;  
 System.out.println("i3==i4: "+(i3==i4));
复制代码
    输出的结果是:
    i1==i2: false
    i3==i4: true
 说明:
 
equals() 比较的是两个对象的值(内容)是否相同。
 
"==" 比较的是两个对象的引用(内存地址)是否相同,也用来比较两个基本数据类型的变量值是否相等。
//声明一个Integer对象Integer num = 10;//以上的声明就是用到了自动的装箱:解析为Integer num = new Integer(10);
以上就是一个很好的体现,因为10是属于基本数据类型的,原则上它是不能直接赋值给一个对象Integer的,但jdk1.5后你就可以进行这样的声明,这就是自动装箱的魅力
自动将基本数据类型转化为对应的封装类型。成为一个对象以后就可以调用对象所声明的所有的方法
自动拆箱:故名思议就是将对象重新转化为基本数据类型:
//装箱Integer num = 10;
//拆箱int num1 = num;
自动拆箱有个很典型的用法就是在进行运算的时候:因为对象时不恩直接进行运算的,而是要转化为基本数据类型后才能进行加减乘除
Integer num = 10;//进行计算时隐含的有自动拆箱System.out.print(num--);
  可变参数
当调用函数的时候不确定要使用多少个参数的时候使用可变参数,可变参数必须放在最后面写入。例如:
 getSome(1,2,3,11,1);
 
 //可变参数..这里接收了5个参数,一个是a的,剩下四个在args这个数组里面
 public static void getSome(int a ,Object...args)
 { 
      //以数组的形式存储,方便使用
      for(int x=0;x<args.length;x++)
           System.out.println(args[x]);
 } 

 

增强for循环

   增强for循环,能对数组和实现了Iterator接口的集合类进行遍历。例如:
  //for(type 变量名 :集合变量名){...}
  
  //对int数组进行遍历
  int[] arr1 ={1,2,3,4};
  for(Integer i : arr1)
       System.out.println(i);
  
  //对集合的迭代,迭代器多了一个删除的功能
  Set<String> set = new TreeSet<String>();
  set.add("add");
  set.add("asfasf");
  set.add("fasg");
  Iterator it = set.iterator();
  while(it.hasNext())
  {
       System.out.println(it.next());
  }
 
  //而这种增强for只能进行遍历
  for(String s : set)
       System.out.println(s); 
 
                                      

0 0
原创粉丝点击