黑马程序员--Java学习加强21--JDK1.5新特性

来源:互联网 发布:滴露 威露士 知乎 编辑:程序博客网 时间:2024/05/24 01:39

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------

      JDK1.5(开发代号猛虎)的一个重要主题就是通过新增一些特性来简化开发,这些特性包括泛型,for-each 循环,自动装包/拆包,枚举,可变参数, 静态导入 。使用这些特性有助于我们编写更加清晰,精悍,安全的代码。 

一、泛型

      泛型用于解决安全问题,是一个安全机制。泛型出现的好处:

(1)将运行时期出现的问题ClassCasException转移到了编译时期,方便于程序员解决问题。让运行时期减少问题。

(2)避免了强制转换的麻烦。

实例:当我们如下网集合中添加元素时,编译时不会出错,但是运行时却出错了。

import java.util.*;class Test {public static void main(String[] args) {Set s=new TreeSet();s.add("asf");s.add("ase");s.add(2);System.out.println(s);}}

运行时出现的错误为:

但是当我们加入泛型后:

import java.util.*;class Test {public static void main(String[] args) {Set<String> s=new TreeSet<String>();s.add("asf");s.add("ase");s.add(2);System.out.println(s);}}

编译时期就会出错:

 

不信的话,自己可以试试看。

二、For-Each循环

        For-Each循环得加入简化了集合的遍历。假设我们要遍历一个集合对其中的元素进行一些处理。典型的代码为:

void processAll(Collection c){    for(Iterator i=c.iterator(); i.hasNext();){        MyClass myObject = (MyClass)i.next();        myObject.process();    }}


例:

import java.util.*;class Test {public static void main(String[] args) {Set<String> s=new TreeSet<String>();s.add("a1");s.add("a2");s.add("a3");s.add("a4");s.add("a5");s.add("a6");for(String set:s)System.out.println(set);}}


输出结果是:



三、静态导入

      要使用用静态成员(方法和变量)我们必须给出提供这个方法的类。使用静态导入可以使被导入类的所有静态变量和静态方法在当前类直接可见,使用这些静态成员无需再给出他们的类名。

import static java.lang.Math.*;…….r = sin(PI * 2); //无需再写r = Math.sin(Math.PI);


四、可变参数

       可变参数:其实就是以前学的数组的简写形式;不用每次都手动建立数组对象,只要将要操作的元素作为参数传递即可隐式的将这些参数封装成了数组。

例:

public class VariableParameter {public static void main(String[] args){System.out.println(add(1,2,3,4,5,6,7,8));}public static int add(int ... args){ int sum=0; for (int i = 0; i < args.length; i++) {sum+=args[i];} return sum;}}


五、自动装箱与拆箱

        我们知道集合中存入的是 对象,但是我们往集合中存入一个基本数据类型的数会怎样呢?如果是在JDK1.5 版本以前,编译时期就会出错,但是在JDK1.5版本之后增加了自动装箱与拆箱,使得以上做法是合法的。

public class AutoBox {/** * @param args *//** * @param args */public static void main(String[] args){Integer integer=12;//自动装箱System.out.println(integer+5);//自动拆箱Integer i1=12;Integer i2=12;Integer i5=new Integer(12);System.out.println(i1==i2);System.out.println(i1==i5);Integer i3=128;Integer i4=128;System.out.println(i3==i4);//-128~127}}

运行结果是:

 

      为什么会产生这样的结果呢,这里我解释一下这样结果的原因。在Java中对于从-127到128之间的数,因为数据比较小,而且使用的比较频繁,在内存中就保存一份,它们都指向的是同一份,对于其他的数据就分别保存了。对于3来说是小数,所以i1和i2是相等的,而213就相对较大了,所以结果是false。

六、枚举

       为什么要有枚举?

       问题:要定义星期几或性别的变量,该怎么定义?假设用1-7分别表示星期一到星期日,但有人可能会写成 int weekDay=0;

枚举就是让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译就会报错,枚举是可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。

public class EnumTest {public static void main(String[] args){WeekDay weekDay=WeekDay.FRI;System.out.println(weekDay);System.out.println(weekDay.name());System.out.println(weekDay.ordinal());//排行System.out.println(weekDay.toString());System.out.println(WeekDay.valueOf("TUE"));System.out.println(WeekDay.values().length);}public enum WeekDay{SUN(1),MON(),TUE(),WED(3),THI(),FRI(),SAN();//元素列表必须位于其他成分之前,必须有;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(3){public TrafficLamp nextLamp(){return RED;} };private int time;private TrafficLamp(int time){this.time=time;}public abstract TrafficLamp nextLamp();}}

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------





0 0