1.5新特性

------- android培训 java培训 、期待与您交流!----------

Java1.5新特性:

一、自动装箱 和 自动解箱技术

  1. int x = 100;  
  2. Integer y = x; // 自动装箱, 把基本数据类型自动当作对象来使用  
  3. x = y;   // 自动拆箱, 把对象当作基本数据类型使用  
二、静态引用概念:
    用 import static 节省以后的书写。
        引入静态属性 import static java.lang.System.out;
        引入静态方法 import static java.lang.Math.random;
        import static 只能引入静态的方法或属性;不能只引入类或非静态的方法。
    如:import static java.lang.System.*;
     out.println(“a”);  //等于System.out.println("a"); 由于out是一个字段,所以不能更节省了
 
三、可变长参数
    一个方法的参数列表中最多只能有一个可变长参数,而且这个变长参数必须是最后一个参数
    方法调用时只在必要时去匹配变长参数。
  1. public static void main(String[] args) {  
  2.         // TODO Auto-generated method stub  
  3.         System.out.println(add(1,2,3,5));  
  4.         System.out.println(add(2,3,5));       
  5.     }  
  6.       
  7.     public static int add(int x,int ...args) {  
  8.         int sum = x;  
  9.         for(int i=0;i<args.length;i++) {  
  10.             sum += args[i];  
  11.         }  
  12.         return sum;  
  13.     }  

四、枚举 enum
    1、定义:枚举是一个具有特定值的类型,对用户来说只能任取其一。
       对于面向对象来说时一个类的对象已经创建好,用户不能新生枚举对象,只能选择一个已经生成的对象。
    2、枚举本质上也是一个类。枚举值之间用逗号分开,以分号结束(如果后面没有其它语句,分号可不写)。
    3、枚举分为两种:类型安全的枚举模式和类型不安全的枚举模式
    4、枚举的超类(父类)是:Java.lang.Enum。枚举是 final 类所以不能继承或被继承。但可以实现接口。
       枚举中可以写构造方法,但构造方法必需是私有的,而且默认也是 私有的 private
    5、一个枚举值实际上是一个公开静态的常量,也是这个类的一个对象。
    6、枚举中可以定义抽象方法,但实现在各个枚举值中(匿名内部类的方式隐含继承)
       由于枚举默认是 final 型,不能被继承,所以不能直接用抽象方法(抽象方法必须被继承)
       在枚举中定义抽象方法后,需要在自己的每个枚举值中实现抽象方法。
       
    枚举是编译期语法,编译后生成类型安全的普通类

  1. public enum Color {    
  2.   RED, GREEN, BLANK, YELLOW    
  3. }    

switch
  JDK1.6后switch语句支持enum类型,使用枚举,能让我们的代码可读性更强。
 
 Java代码
  1. enum Signal {  
  2.          GREEN, YELLOW, RED  
  3.  }  
  4.  public class TrafficLight {  
  5.          Signal color = Signal.RED;  
  6.          public void change() {  
  7.                  switch (color) {  
  8.                  case RED:  
  9.                          color = Signal.GREEN;  
  10.                          break;  
  11.                  case YELLOW:  
  12.                          color = Signal.RED;  
  13.                          break;  
  14.                  case GREEN:  
  15.                          color = Signal.YELLOW;  
  16.                          break;  
  17.                  }  
  18.          }  
  19.  }  
  20.    
用枚举实现一周的日期 , 要求返回中文日期
  1. public enum Week {  
  2.     MON{  
  3.         public String getLocalString() {  
  4.             return "星期一";  
  5.         }  
  6.     },  
  7.     TUE{  
  8.         public String getLocalString() {  
  9.             return "星期二";  
  10.         }  
  11.     },  
  12.     WED{  
  13.         public String getLocalString() {  
  14.             return "星期三";  
  15.         }  
  16.     },  
  17.     THU{  
  18.         public String getLocalString() {  
  19.             return "星期四";  
  20.         }  
  21.     },  
  22.     FRI{  
  23.         public String getLocalString() {  
  24.             return "星期五";  
  25.         }  
  26.     },  
  27.     SAT{  
  28.         public String getLocalString() {  
  29.             return "星期六";  
  30.         }  
  31.     },  
  32.     SUN{  
  33.         public String getLocalString() {  
  34.             return "星期天";  
  35.         }  
  36.     };  
  37.   
  38.     public abstract String getLocalString();  
  39. }  
  40.   
  41. /** 
  42.  * 第二种实现方式 
  43.  
  44.  */  
  45. public enum Week {  
  46.     M("一"),  
  47.     T("二");  
  48.     private String day;  
  49.     Week(String s){  
  50.         this.day=s;  
  51.     }  
  52.     public String getDay(){  
  53.         return this.day;  
  54.     }  
  55. }   

五、新型 for 循环 for-each,用于追求数组与集合的遍历方式统一
    1、数组举例:
    

  1. int[]  arr  =  {1,2,3,4,5,6};  
  2.      for(int i=0; i<arr.length; i++){  
  3.         System.out.print(arr[i]);  
  4.      }  //以上是以前的 for 循环遍历,比较下面的for—each  
  5.      for(int i : arr){  
  6.          System.out.print(i);  
    2、集合举例:
  1. List  list  =  new ArrayList();  
  2.      for(Object  o :list){  
  3.         System.out.println(o);  
  4.       }  
注:凡是实现了java.lang.Iterable接口的类就能用 for-each遍历
    用 for each 时,不能用list.remove()删除,因为他内部的迭代器无法调用,造成多线程出错。
    这时只能用 for 配合迭代器使用。   
六  泛型 

    1、为了解决类型安全的集合问题引入了泛型。
       泛型是编译检查时的依据,也是编译期语法。
      (编译期语法:编译期有效,编译后擦除,不存在于运行期)
    2、简单的范型应用:集合(ArrayList, Set, Map, Iterator, Comparable)      

  1. List<String> l = new ArrayList<String>();  
       <String>:表示该集合中只能存放String类型对象。
    3、使用了泛型技术的集合在编译时会有类型检查,不再需要强制类型转换。
       String str  =  l.get(2);  //因为List<String>  l, 所以 Error
       注:一个集合所允许的类型就是这个泛型的类型或这个泛型的子类型。
    4、
  1.   List<Number>  l  =  new  ArrayList<Integer>  //Error  
  2.   List<Integer> l = new ArrayList<Integer>  //Right  
  3.  必须类型一致,泛型没有多态  
    5、泛型的通配符<?>
       泛型的通配符表示该集合可以存放任意类型的对象。但只有访问,不可以修改。
        static void print( Cllection<?> c ){
         for( Object o : c )
         out.println(o);
        }
    6、带范围的泛型通配符
      泛型的声明约定T表示类型,E表示元素
        (1)、上界通配符,向下匹配:<?  extends  Number>    表明“extends”或“implements”,认为是 final 的
             表示该集合元素可以为Number类型及其子类型(包括接口);

        (2)、下界通配符,向上匹配:<?  super  Number>
             表示该集合元素可以为Number类型及其父类型
        (3)、接口实现:<? extends Comparable>
             表示该集合元素可以为实现了Comparable接口的类
    7、泛型方法
        在返回类型与修饰符之间可以定义一个泛型方法,令后面的泛型统一
        这里只能用 extends 定义,不能用 super ;后面可以跟类(但只能有一个,且要放在首位)其余是接口
        符号只有   &    //“&”表示“与”;逗号表示后面的另一部分
        静态方法里面,不能使用类定义的泛型,只能用自己定义的;因为静态方法可以直接调用;
        所以普通方法可以使用类定义的及自己定义的泛型      

  1. public static <T> void copy(T[] array,Stack<T> sta){……}  
  2.   
  3. public static <T,E extends T> void copy (T[] array,Stack<E> sta){…..}  
  4.   
  5. public static <T extends Number&Comparable> void copy(List<T> list,T[] t);  

    静态方法不能使用类的泛型,因为静态方法中没有对象的概念。
    在使用接口的时候指明泛型。
     class Student  implements  Comparable<Student>{…….}

泛型集合类的综合案例

  1. HashMap<String,Integer> hm = new HashMap<String,Integer>();  
  2.  hm.put("zxx",19);  
  3.  hm.put("lis",18);  
  4.    
  5.  Set<Map.Entry<String,Integer>> en= hm.entrySet();  
  6.  for(Map.Entry<String,Integer> me : en) {  
  7.   System.out.println(me.getKey() + ":" + me.getValue());  
  8.  }  
交换数组中的两个元素的位置的泛型方法语法定义
  1. public static <E> void swap(E[] a, int i, int j) {  
  2.     E t = a[i];  
  3.     a[i] = a[j];  
  4.     a[j] = t;  
泛型方法的另外一个常见应用就是调用者无需对返回值进行类型转换
  1.   public static <T> T[] fill(T[] a, T v) {         for(int i = 0; i < a.length; i++) a[i] = v;         return a;     }   

通过反射获得泛型的参数化类型
  1. Class GenericalReflection {  
  2.           private Vector<Date> dates = new Vector<Date>();  
  3.           public void setDates(Vector<Date> dates) {  
  4.             this.dates = dates;  
  5.           }  
  6.           public static void main(String[] args) {  
  7.            Method methodApply = GenericalReflection.class.getDeclaredMethod("applyGeneric", Vector.class);  
  8.            ParameterizedType pType = (ParameterizedType)  
  9.                             (methodApply .getGenericParameterTypes())[0];  
  10.                     System.out.println("setDates("  
  11.                             + ((Class) pType.getRawType()).getName() + "<"  
  12.                             + ((Class) (pType.getActualTypeArguments()[0])).getName()  
  13.                             + ">)" );  
  14.           }  
  15.     }  

泛型 DAO 的应用:
  1. public abstract class DaoBaseImpl<T> implements DaoBase<T> {  
  2.     protected Class<T> clazz;  
  3.     public DaoBaseImpl() {  
  4.         Type type = this.getClass().getGenericSuperclass();  
  5.         ParameterizedType pt = (ParameterizedType) type;  
  6.         this.clazz = (Class) pt.getActualTypeArguments()[0];  
  7.         System.out.println("clazz = " + this.clazz);  
  8.     }  
  9.     }  
  10. public class ArticleDaoImpl extends DaoBaseImpl<Article> implements ArticleDao {  
  11.     } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值