jdk1.5的特性

学习java过程中一直在使用jdk1.7,对于其他版本的jdk了解甚微,作为一名入门的小白,总结了下jdk1.5这个版本增加的特性,与喜欢it的朋友共勉奋斗


JDK1.5新特性:

1.自动装箱与拆箱:

在JDK5.0以前,在原始类型与相应的包装类之间的转化是不能自动完成的。要完成这种转化,需要手动调用包装类的构造函数,
基本数据类型包装类这些引用数据类型与其他引用数据类型有些不同,他们有更强大的功能,即自动装箱拆箱。即在需要的情况下,基本类型与包装类型可以通用。有些时候我们必须使用引用数据类型时,可以传入基本数据类型。
比如:
基本类型可以使用运算符直接进行计算,但是引用类型不可以。而基本类型包装类作为引用类型的一种也可以计算,原因在于,Java”偷偷地”自动地进行了数据类型的转换。
相对应的,引用数据类型变量的值必须是new出来的内存空间地址值,而我们可以将一个基本类型的值赋值给一个基本类型包装类的引用。原因同样在于Java又”偷偷地”自动地进行了数据类型的转换。
如:
Integer a = 10;    //10这个基本类型值自动装箱成了引用类型
int b = new Integer(“10”);  //引用数据类型自动拆箱成了基本类型
Integer c = b + a; //计算时,a自动拆箱为基本类型,结果自动装箱成引用类型。
类型包装器有:Double,Float,Long,Integer,Short,Character和Boolean 



2泛型

Java在1.5之前一直没有相对应的功能
泛型用来灵活地将数据类型应用到不同的类、方法、接口当中。将数据类型作为参数传递。
泛型是数据类型的一部分,我们将类名与泛型合并一起看做数据类型。
泛型的定义:定义泛型类可以预支地使用未知的类型。
泛型的使用:一般在创建对象时,将未知的类型确定具体的类型。当没有指定泛型时,默认类型为Object类型。
泛型类:
定义:类名后<变量>  如:class A<E> {使用E完全类的定义}
使用:创建对象时确定类型
泛型方法:
定义:方法返回值前<变量> 如:public <T> void method(){使用T}
使用:调用方法时确定类型
泛型接口:
定义:接口后<变量> 如: interface B<T>{使用T完成接口定义}
使用:
1、定义类时确定类型
2、始终不确定类型,直到创建对象时确定类型

在JDK1.5出现前,使用Object代表任意类型,但在使用时,涉及到了强转的麻烦。泛型替代了Object来代表任意类型。
泛型在编译时会擦除:泛型仅用来在编译期限制、方便程序员的操作,实际上真正编译后的.class中是没有泛型的,其中仍然使用的为Obejct类,通过类似多态的方式完成任意某个类型的指定。
泛型通配符 
定义:(查看ArrayList的构造方法)无法在类中使用
使用:调用方法时可以给予任意类型。参照Arraylist的构造方法
  extends E代表只要是E类型的子类即可
  super E代表只要是E类型的父类即可





3静态导入

在导包的过程中我们可以直接导入静态部分,这样某个类的静态成员就可以直接使用了。在源码中经常会出现静态导入,而在日常开发中几乎没有人使用。
静态导入格式:
import static XXX.YYY;   导入后YYY可直接使用。
静态导入功能对于JDK 5.0以前的版本是不支持的。


import static java.lang.Math.*;
public class StaticImport {
 public static void main(String[] args){
   int x = 1;
   try {
    x++;
   } finally {
    System.out.println("template");
   }
   System.out.println(x);
  
  
   System.out.println(max(3, 6));
   System.out.println(abs(3 - 6));
  
 }
}




4 增强for循环

如果使用多态,我们发现之前所使用的ArrayList子类中的带索引方法均为ArrayList自身特有方法,并非Collection接口或者AbstractColletion类中的方法。(实际上我们只需要关心Collection中的方法,因为接口中规定了要实现的核心功能方法,类只负责实现,这样更一步分离了功能的定义与实现)。
所以所有集合的通用功能中,不包含通过索引访问元素的方法,则无法通过索引获取元素。实际开发中,我最常使用的是foreach循环(又叫增强for循环)来完成元素的获取。
增强for循环用来迭代集合或数组,格式如下:
for(容器内类型 临时变量:容器) {
内部可以直接使用临时变量访问数据
}



5.可变参数(Varargs)

public class VarableParameter {
/**
* @param args
*/
public static void main(String[] args) {


   System.out.println(add(2,3));
   System.out.println(add(2,3,5));  
}
public static int add(int x,int... args){
   int sum = x;
/* for(int i=0;i<args.length;i++){
     sum += args[i];
   }*/
  
   for(int arg : args){
    sum += arg;
   }
   return sum;
   }
}




6.内省

  是 Java语言对Bean类属性、事件的一种缺省处理方法。例如类A中有属性name,那我们可以通过getName,setName来得到其值或者设置新 的值。通过getName/setName来访问name属性,这就是默认的规则。Java中提供了一套API用来访问某个属性的getter /setter方法,通过这些API可以使你不需要了解这个规则(但你最好还是要搞清楚),这些API存放于包java.beans中。
一般的做法是通过类Introspector来获取某个对象的BeanInfo信息,然后通过BeanInfo来获取属性的描述器 (PropertyDescriptor),通过这个属性描述器就可以获取某个属性对应的getter/setter方法,然后我们就可以通过反射机制来 调用这些方法。
ReflectPoint pt1 = new ReflectPoint(3,5);
BeanInfo beanInfo = Introspector.getBeanInfo(pt1.getClass());
	 PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
	 Object retVal = null;
	 for(PropertyDescriptor pd : pds){
	 Method methodGetX = pd.getReadMethod();
	 retVal = methodGetX.invoke(pt1);




 }
 

7.枚举

把集合里的对象元素一个一个提取出来。枚举类型使代码更具可读性,理解清晰,易于维护。枚举类型是强类型的,从而保证了系统安全性。而以类的静态字段实现的类似替代模型,不具有枚举的简单性和类型安全性。
简单的用法:JavaEnum简单的用法一般用于代表一组常用常量,可用来代表一类相同类型的常量值。
复杂用法:Java为枚举类型提供了一些内置的方法,同事枚举常量还可以有自己的方法。可以很方便的遍历枚举对象。
public class EnumTest {
/**
* @param args
*/
public static void main(String[] args) {
   WeekDay1 weekDay = WeekDay1.MON;
   System.out.println(weekDay.nextDay());
   WeekDay weekDay2 = WeekDay.FRI;
   System.out.println(weekDay2);
   System.out.println(weekDay2.name());
   System.out.println(weekDay2.ordinal()); 
   System.out.println(WeekDay.valueOf("SUN").toString());
   System.out.println(WeekDay.values().length);
   new Date(300){};
}
public enum WeekDay{
   SUN(1),MON(),TUE,WED,THI,FRI,SAT;
   private WeekDay(){System.out.println("first");}
   private WeekDay(int day){System.out.println("second");}
}


public enum TrafficLamp{
   RED(30){
    public TrafficLamp nextLamp(){
     return GREEN;
    }
   },
   GREEN(45){
    public TrafficLamp nextLamp(){
     return YELLOW;
    }   
   },
   YELLOW(5){
    public TrafficLamp nextLamp(){
     return RED;
    }   
   };
   public abstract TrafficLamp nextLamp();
   private int time;
   private TrafficLamp(int time){this.time = time;}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值