-------<a href="http://www.itheima.com/"">android培训</a>、<a href="http://www.itheima.com/" ">java培训</a>期待与您交流!----------
黑马程序员_JDK1.5新特性总结
JDK1.5是Java里程碑式的进步。1.5的新特性帮助程序员能更简便的写程序。
新特性有:
可变参数 静态导入 高级for循环 自动拆箱 装箱 枚举 內省 泛型
的确是很丰富。在下文中都将会一一阐述。
可变参数
以前当一个方法接受若干个不能确定参数个数的同类型的数据时,就定义为数组形式 如:
public void add(int[] arr){
}
该方法是将传入的参数进行相加。在调用该方法时就必须要定义一个数组,将数组作为该方法参数。但引入可变参数这个新特性后,该方法就可以这么定义
Public void add(int...jiasu)
使用时无需定义数组 直接传入要加的的数 add(5,6,3).
但要注意可变参数必须定义在参数列表的最后。
method(int...a ,String s) 这样定义是不正确的。
高级for循环
以前遍历一个数组,for循环是这样写:
String [] s=new String[100];
for(int i=0;i<s.length;i++){
}
现在引用高级for循环
for(String str:s){
}
写法更简便,阅读性也更强了。
对于所有实现了iterable接口的容器类都可以使用高级for循环。
静态导入:
JDK 1.5 增加的静态导入语法用于导入类的某个静态属性或方法。使用静态导入可以简化程序对类静态属
性和方法的调用。
语法:import static 包名.类名.静态属性|静态方法|*
例如:
import static java.lang.System.out
import static java.lang.Math.*
使用静态导入后,我们在写程序时,就不再需要写类名了。但有种情形要注意,当如果使用静态导入 类的方法与自己写的静态方法的方法名与参数列表一样时。这时为了以便区分,自己写的方法要加上类名.方法的形式调用。
自动拆箱 装箱:
JDK5.0的语法允许开发人员把一个基本数据类型直接赋给对应的包装类变量, 或者赋给 Object 类型的变
量,这个过程称之为自动装箱
自动拆箱与自动装箱与之相反,即把包装类对象直接赋给一个对应的基本类型变量。
典型应用:
List list = new ArrayList();//因为集合中不能存储基本数据类型数据
list.add(1);//会自动的装箱成(new Integer(1))
int j = (Integer)list.get(0);//自动拆箱
这个特性的出现,是我们编程人员省去了很多不必要的麻烦,提高了开发效率。
5.枚举类
1:为什么需要枚举?
一些方法在运行时,它需要的数据不能是任意的,而必须是一定范围内的值,此类问题在JDK5以前采用自定义带有枚举功能的类解决,Java5以后可以直接使用枚举予以解决。
JDK 5新增的 enum 关键字用于定义一个枚举类。
2:枚举类具有如下特性:
1.枚举类是一种特殊形式的Java类。
2.枚举类中声明的每一个枚举值代表枚举类的一个实例对象。
3:与java中的普通类一样,在声明枚举类时,也可以声明属性、方法和构造函数,但枚举类的构造函数
必须为私有的(这点不难理解)。
4.枚举类也可以实现接口、或继承抽象类。
5.Java中声明的枚举类,均是java.lang.Enum类的孩子,它继承了Enum类的所有方法。常用方法:
只说一个JDK文档中据说是查不到的。
values() 此方法虽然在JDK文档中查找不到,但每个枚举类都具有该方法,它遍历枚举类的所有枚举值非常方便。
以下代码为演示定义一个常见的枚举类。
内省:內省在我的博客里已经有专门一篇文章介绍了在这里就不复述了。
泛型:
泛型是JDK1.5最大的亮点。
泛型是一种安全机制。
泛型的出现把很多的ClassCastException即运行时异常转为编译时异常,
可以说极大的提高了程序的健壮性。
泛型是跟编译器配套使用的。但是泛型的技术并没有像C++做的那么的好,在编译的时候也写进class文件 中。在Java中,在编译为class文件的时候,把泛型类型去掉了(泛型的擦除,主要是为了兼容类加载 器),即在class文件中没有泛型的踪影。
泛型的好处
1:把运行时的异常转到了编译阶段
2:避免了强制类型的转换
泛形的基本术语,以ArrayListList<E>为例:<>念着typeof
ArrayList<E>中的E称为类型参数变量
ArrayList<Integer>中的Integer称为实际类型参数
整个称为ArrayList<E>泛型类型
整个ArrayList<Integer>称为参数化的类型
在什么时候定义泛型?
当我们定义方法的时候,但又不确定参数类型时,这时候我们就可以定义泛。但是当调用者在使用方法的时候,肯定知道自己需要传入什么样类型的参数,所以当调用者调用的 时候,必须传入具体的引用数据类型。
使用泛形时的几个常见问题:
使用泛形时,泛形类型须为引用类型,不能是基本数据类型。
ArrayList<String> list = new ArrayList<Object>();//错,只能一边指定泛型或二边相同
ArrayList<Object> list = new ArrayList<String>();//错,只能一边指定泛型或二边相同
ArrayList<String> list = new ArrayList ();兼容1.4//对
ArrayList list = new ArrayList<String>(); 兼容1.4//对
自定义泛形---泛型方法
Java程序中的普通方法、构造方法和静态方法中都可以使用泛型。方法使用泛形前,必须对泛形进行声 明,语法:<T> ,T可以是任意字母,但通常必须要大写。<T>通常需放在方法的返回值声明之前。例
如:
public static <T> void doxx(T t);
泛型类
如果一个类多处都要用到同一个泛型,这时可以把泛形定义在类上(即类级别的泛型),语法格式如 下:
public class BaseDao<T> {
private T field1;
public void save(T obj){}
public T getId(int id){}
}
注意,静态方法不能使用类定义的泛形,而应单独定义泛形。
泛型的通配符:
?就是通配符亦叫占位符。什么意思呢?当我们定义类,方法(参数)不确定的时候,可以用?来表示
比如:
public void show(<?> a){}
由于在方法中,传入的数据类型不确定,所以用到了泛型,但是在调用的时候,调用者肯定知道
如:
int a=3;
show(a);
String b="dfd";
show(b);
泛型限定:
有时候我们需要的是把一个体系全部的纳入到泛型之中,这时候该怎么做呢?
不知道是否还记得?通配符,我们可以通过继承来实现
<? extends Collection>这被我们村称之为上边界,因为只能作用到其最顶层(父类),通过这样的定义,可以把其子类当做参数来传递,这主要使用在添加的。 因为在取出的时候方便,不用再进行类型的判断。
这种叫上限。
既然有了上边界:那么自然的就会有下边界
具体如下:
<? super comparable> 这就是下边界,通常用来进行比较。比较的时候既可以使用自己的比较器,也可以使用父类的比较器。这种叫下限。
看网上有的说反射也是java的新特性。但听张老师的视频上说反射不是。我也不敢确定了。但我的博客中有一篇专门讲反射的文章,这里就不多做复述了。
-------<a href="http://www.itheima.com/"">android培训</a>、<a href="http://www.itheima.com/" ">java培训</a>期待与您交流!----------