《第2章 Java_5语言新特性课件》由会员分享,可在线阅读,更多相关《第2章 Java_5语言新特性课件(38页珍藏版)》请在金锄头文库上搜索。
1、第2章 Java 5语言新特性,(学时数:学时),学习要点:,1了解java5.0新语言特性包括哪几个方面。 2了解java5.0中增强的for循环 。 3了解java5.0的注释新特性 。 4掌握枚举 。 5. 掌握范型 。 6. 掌握类型自动转换 。 7. 了解静态导入 8. 了解格式化输入与输出 。,第2章 Java 5语言新特性,1.1 新语言特性总览 1.2 增强的for循环 1.3 注释 1.4 枚举 1.5 范型 1.6 类型自动转换 1.7 静态导入 1.8 格式化输入与输出,1.1 新语言特性总览,1.1.1 Java 5.0 的诞生 1.1.2 Java 5.0的新语言特性
2、,1.2 增强的for循环,1.2.1 Init表达式 1.2.2 局限性,1.3 注释,1.3.1 注释的作用 1.3.2 用户自定义标签 1.3.3 获取注释信息,1.4 枚举,1.4.1 enum类型特征 1.4.2 使用enum类型,1.5 范型,1.5.1 类型安全 1.5.2范型定义 1.5.3 声明范型类和类型参数 1.5.4 声明范型接口和多个类型参数,1.6 类型自动转换,1.6.1 类型自动转换,1.7 静态导入,1.7.1 静态导入,1.8 格式化输入与输出,1.8.1 格式化输出 1.8.2 格式化输入,Java5.0的诞生,时间:2004年10月 版本名称不是Java
3、1.5而是Java 5.0的原因 ?从Java诞生至今已有9年时间,而从有J2SE算起也有5个年头了;在这样的背境下,将该版本号从1.5改为5.0可以更好的反映出新版的Java技术的成熟度、稳定性、可伸缩性、安全性。 Java 5.0的目标 :通过增强Java平台的力量,允许开发者更容易地使用,Java编程语言的这些改进将吸引大量各种Java开发者 。,Java 5.0的新特性,范型 :添加编译时类型来检查您的代码 ,使用范型来代替所有的类型转换 。 加强的For循环:在Collection中使用循环来代替迭代器 。 自动打包:无须手工打包和拆包(box and unbox)原始类型 。 枚举
4、:Java开发者 可以使用枚举类 。 变参:方法调用之中把变参当作一系列独立的参数 。 静态导入:静态倒入(Static Import)特征允许您导入所有静态类的成员到您的代码中,并且可以通过简短和非限制的名称来引用这些常量和方法。 评注 :提供了一个代码运行时可访问的信息 。 国际化:Unicode 4.0的支持 。 质量:稳定性、强壮性和兼容性,Init表达式,在循环中,初始化表达式只计算一次 未增强的For : int sum = 0; Integer numbers = computeNumbers(); for (int i=0; i numbers.length ; i+) sum
5、 += numbersi; 增强后的For: int sum = 0; for ( int number: computeNumbers() ) sum += number;,局限性,不可以在迭代期间访问迭代器或下标。 例子1: for (int i=0; i it = n.iterator() ; it.hasNext() ; ) if (it.next() 0) it.remove();,注释的作用,可以被用来生成文档,检查代码间依赖关系,帮助编译器作语法检查。 文档生成工具:Xdoclet 、javadoc 代码检查举例: public class Parent public void
6、foo() System.out.println(Original Implementation of foo); public class Child extends Parent Override public void foo() System.out.println(Overide Implementation of foo); ,注释的作用,子类想重载foo()方法,不过用户可能一时疏忽把它写成了fob()。 错误提示: Child.java:3: method does not override a method from its superclass Override 1 err
7、or,用户自定义标签,用户自定义标签 : package tiger.annotation; /* * 用户自定义标签MyTag */ public interface MyTag /定义了一个tag之后,用户就可以在任何java文件中使用这个tag了: import tiger.annotation.MyTag; public class TagTest MyTag public void testTag() /注释类型还可以有成员变量: package tiger.annotation; /* * 用户自定义标签,带有成员变量的MyTag */ public interface MyTag
8、 String name(); int age(); ,用户自定义标签,用户可以这么使用这个标签: MyTag(name=MyTag,age=1) public void testTag() ,获取注释信息,import java.lang.annotation.Annotation; import tiger.annotation.MyTag; public class TagTest MyTag(name=MyTag,age=1) public void test() public static void main(String args) TagTest tt = new TagTest
9、(); try Annotation annotation =tt.getClass() .getMethod(test).getAnnotations(); for (Annotation tag :annotation) System.out.println(Tag is: + tag); System.out.println(tag.name() + (MyTag)tag).name(); System.out.println(tag.age() + (MyTag)(tag).age(); catch(NoSuchMethodException e) e.printStackTrace(
10、); ,获取注释信息,执行TagTest可以得到输出如下: Tag is:tiger.annotation.MyTag(name=MyTag, age=1) tag.name()MyTag tag.age()1,enum类型特征,它不能有public的构造函数 所有枚举值都是public、static和final的。 默认实现了java.lang.Comparable接口。 enum重载了toString方法 valueOf方法,这个方法和toString方法是相对应的。 values方法 oridinal方法,使用enum类型,遍历所有枚举值: for (Color c: Color.val
11、ues() System.out.println(“find value:” + c);,使用enum类型,在enum中定义方法和变量 : public enum Color Red, Green, Blue; /定义一个变量表示枚举值的数目。 private static int number = Color.values().length ; /* * 随机返回一个枚举值 return a random enum value. */ public static Color getRandomColor() long random = System.currentTimeMillis() %
12、 number; switch (int) random) case 0: return Color.Red; case 1: return Color.Green; case 2: return Color.Blue; default : return Color.Red; ,使用enum类型,重载(Override)toString方法: public String toString() switch (this) case Red: return Color.Red; case Green: return Color.Green; case Blue: return Color.Blue
13、; default: return Unknow Color; ,类型安全,在Java 5.0之前的版本中, Java程序并不是类型安全的。 List stringList= new ArrayList(); stringList.add(abcde); String str = (String)stringList.get(0); 仍然可以把一个整型对象添加到这个队列中, 例如: stringList.add(new Integer(5); 在这种情况下,从字符列表中获取对象时,强制类型转换就会导致运行时异常。 范型是Java迈向类型安全的一个重要步骤,使用范型可以构造出类型安全的代码。,范
14、型定义,所谓范型是指类型参数化(parameterized types)。Java是一种强类型的语言,在J2SE 1.4以及以前的版本中,我们在定义一个Java类的接口或者方法的时候,必须指定变量的类型。在声明范型类、接口或者函数时,定义变量的时候不指定某些变量的具体类型,而是用一个类型参数代替。在使用这个类、接口或者方法的时候,这个类型参数由一个具体类型所代替。,声明范型类和类型参数,public class GenList private T elements; private int size = 0; private int length = 0; public GenList(int
15、 size) elements = (T)new Objectsize; this.size = size; public T get(int i) if (i length) return elementsi; return null; public void add(T e) if (length size - 1) elementslength+ = e; ,声明范型接口和多个类型参数,声明范型接口: public interface GenInterface void func(T t); 声明多个类型参数 public class GenMap ,类型自动转换,自动装包:基本类型自动
16、转为包装类(例如:int Integer)。 自动拆包:包装类自动转为基本类型(例如:Integer int)。 int a = 3; Collection c = new ArrayList(); c.add(a); /自动转换成Integer. Integer b = new Integer(2); c.add(b + 2);/这里Integer先自动转换为int进行加法运算,然后int再次转换为Integer,静态导入,没有静态导入时 Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2); 使用静态导入时 import static java.lang.Math.*; sqrt(pow(x, 2) + pow(y, 2); ,格式化输出,public class TestFormat