---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
JDK1.5一个重要主题就是通过新增一些特性来简化开发,这些特性包括泛型,for-each 循环,自动拆装箱,枚举,可变参数。使用这些特性有助于我们编写更加清晰,精悍,安全的代码。
一、泛型
在Java中能使用到泛型的多是容器类,如各种list map set,因为Java是单根继承,所以容器里边可以放的内容是任何Object,所以从意义上讲原本的设计才是泛型。但用过Java的人是否感觉每次转型很麻烦呢?而且会有些错误,比如一个容器内放入了异质对象,强制转型的时候会出现cast异常。而这中错误在编译器是无从发现的。
1、泛型好处
1).类型安全。 泛型的主要目标是提高 Java 程序的类型安全。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设。没有泛型,这些假设就只存在于程序员的头脑中(或者如果幸运的话,还存在于代码注释中)。
Java 程序中的一种流行技术是定义这样的集合,即它的元素或键是公共类型的,比如“String 列表”或者“String 到 String 的映射”。通过在变量声明中捕获这一附加的类型信息,泛型允许编译器实施这些附加的类型约束。类型错误现在就可以在编译时被捕获了,而不是在运行时当作 ClassCastException 展示出来。将类型检查从运行时挪到编译时有助于您更容易找到错误,并可提高程序的可靠性。
2).消除强制类型转换。 泛型的一个附带好处是,消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。
尽管减少强制类型转换可以降低使用泛型类的代码的罗嗦程度,但是尽管减少强制类型转换可以降低使用泛型类的代码的罗嗦程度,但是声明泛型变量会带来相应的罗嗦。比较下面两个代码例子。
<span style="font-size:18px;">该代码不使用泛型:
List li = new ArrayList();
li.put(new Integer(3));
Integer i = (Integer) li.get(0);
该代码使用泛型:
List<Integer> li = new ArrayList<Integer>();<span style="white-space:pre"> </span>//<span style="font-size:18px; white-space: pre;">声明泛型变量会带来相应的罗嗦</span>
li.put(new Integer(3));
Integer i = li.get(0);</span>
二、for-each循环
语法:
for ( type 变量名:集合变量名 ) {…}
注意事项:
迭代变量必须在( )中定义
集合变量可以是数组或实现了Iterable接口的集合类
举例:
<span style="font-size:18px;">public static int add(int x,int ...args) {
int sum = x;
for(int arg:args) {<span style="white-space:pre"> </span>//使用增强for循环迭代
sum += arg;
}
return sum;
}</span>
三、自动拆装箱
自动装箱:
Integer num = 12;
自动拆箱:
System.out.println(num1 + 12);
基本数据类型的对象缓存:
Integer num1 = 12;
Integer num2 = 12;
System.out.println(num1 == num2); //true,12作为Integer对象存放在byte常量池,num1,num2同时指向12Integer在常量池的地址
Integer num3 = 129;
Integer num4 = 129;
System.out.println(num3 == num4); //false,129不在byte范围之内,num3,num4指向不同地址
Integer num5 = Integer.valueOf(12);
Integer num6 = Integer.valueOf(12);
System.out.println(num5 == num6); //true,同样都是byte常量池。指向地址一样
四、枚举
1、为什么要有枚举
问题:要定义星期几或性别的变量,该怎么定义?
假设用1-7分别表示星期一到星期日,但有人可能会写成int weekday = 0;或即使使用常量方式也无法阻止意外。
2、枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则,编译器就会报错。枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。
3、用普通类如何实现枚举功能,定义一个Weekday的类来模拟枚举功能。
私有的构造方法
每个元素分别用一个公有的静态成员变量表示
可以有若干公有方法或抽象方法。采用抽象方法定义nextDay就将大量的if.else语句转移成了一个个独立的类。
4、枚举的基本应用
举例:定义一个Weekday的枚举。
<span style="white-space:pre"> </span>public enum WeekDay{
<span style="white-space:pre"> </span>SUN(1),MON(),TUE,WED,THI,FRI,SAT;
<span style="white-space:pre"> </span>private WeekDay(){System.out.println("first");}
<span style="white-space:pre"> </span>private WeekDay(int day){System.out.println("second");}
<span style="white-space:pre"> </span>}
5、总结:
枚举是一种特殊的类,其中的每个元素都是该类的一个实例对象,例如可以调用 WeekDay.SUN.getClass().getName和WeekDay.class.getName()。
五、可变参数
1、可变参数就是一个方法可以接受的参数不固定
例如:
<span style="white-space:pre"> </span><span style="font-size:18px;">public static void main(String[] args){</span>
<span style="font-size:18px;"><span style="white-space:pre"> </span>/*</span>
<span style="font-size:18px;"><span style="white-space:pre"> </span> *调用同一个方法add,但是输入参数不一样</span>
<span style="font-size:18px;"><span style="white-space:pre"> </span> */
<span style="white-space:pre"> </span> System.out.println(add(2,3,4));
<span style="white-space:pre"> </span> System.out.println(add(2,3));
<span style="white-space:pre"> </span> System.out.println(add(2,3,4,5));
<span style="white-space:pre"> </span>}</span>
<span style="font-size:18px;"><span style="white-space:pre"> </span>public static int add(int x, int... args){
<span style="white-space:pre"> </span> int sum = x;
<span style="white-space:pre"> </span> for (int i = 0; i < args.length; i++) {
<span style="white-space:pre"> </span> sum += args[i];
<span style="white-space:pre"> </span> }
<span style="white-space:pre"> </span>return sum;
<span style="white-space:pre"> </span>}</span>
2、可变参数的特点
1). 只能出现在参数列表的最后;
2). ... 位于变量类型和变量名之间,前后有无空格都可以
3). 调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体重以数组的形式访问可变参数
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
详细请查看:www.itheima.com