【教学课件】第10章Java高级特性.ppt

上传人:小飞机 文档编号:5657601 上传时间:2023-08-06 格式:PPT 页数:32 大小:235.50KB
返回 下载 相关 举报
【教学课件】第10章Java高级特性.ppt_第1页
第1页 / 共32页
【教学课件】第10章Java高级特性.ppt_第2页
第2页 / 共32页
【教学课件】第10章Java高级特性.ppt_第3页
第3页 / 共32页
【教学课件】第10章Java高级特性.ppt_第4页
第4页 / 共32页
【教学课件】第10章Java高级特性.ppt_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《【教学课件】第10章Java高级特性.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第10章Java高级特性.ppt(32页珍藏版)》请在三一办公上搜索。

1、第10章 Java高级特性,从1995年Java诞生第一版(1.0版)到现在,Java历经了几次重大变更。从Java 1.0的基础类库到Java 2中的JFC/Swing,Java 1.3中的反射(reflect),Java 1.4中的nio包,再到本章要讲的Java5的高级特性,每种变化都给Java语言带来了新的活力。单从版本号上看,Java从1.4版本升级到5.0就是一次质的飞跃。5.0版本融入了一些新的元素与概念,比如基本数据类型的自动装箱(Auto Boxing)与拆箱(Unboxing),新的for/in循环形式,可变长参数方法(Varargs Method),静态导入(Import

2、 Static),范型(Generics)以及注释(Annotition)等。本章着重讲一下这些新特性。,10.1 自动装箱与拆箱,Java是一种纯面向对象的语言,任何事物包括数字、字符等在Java世界里都是以对象的形象出现的。为了使用方便,Java又保留了一些基本数据类型,例如,int,double,boolean等,分别对应于类Integer,Double,Boolean。基本数据类型的存在的确方便了计算,可是也带来了一些麻烦。例如,想把一个数字2放进一个List里时编译器会报错,理由是int为基本数据类型,而List里必须放置对象,而换成Integer就可以了。对程序开发者来说,int与

3、Integer代表的意义是一样的,但是关键时候却不能互相自动转换,不能不说是一种遗憾。自Java 5.0起,Java开始支持自动装箱(auto boxing)与拆箱(unboxing)。这一重要特征使得程序开发者可以直接把int当Integer使用,或者把Integer当int使用,而无需手工转换。,10.1.1 适用范围,前面说了,自从Java 5.0颁布了自动装箱(auto boxing)与拆箱(unboxing)的法规之后,int就得以与Integer平起平坐了。所以说到底自动装箱拆箱就是服务于以int为代表的基本数据类型以及它们对应的类。表中列出了Java中的基本数据类型与对应的类。,

4、10.1.2 自动装箱与拆箱示例,自动装箱是把基本数据类型封装成类对象,拆箱是指把类对象拆成基本数据类型。在Java 5.0之前,下面的两条语句都是错误的,原因都是类型不匹配(Type missmatch)。而在Java 5.0的环境下,这两条语句可以编译通过:int i=new Integer(4);Integer j=4;Java 5.0之前的编译器认为等号两边的数据类型是不一样的。因此需要把代码修改成下面的模样:int i=new Integer(4).intValue();Integer j=Integer.valueOf(4);,10.1.3 注意事项,当进行自动拆箱操作的时候,由于

5、编译器会自动运行形如intValue()的方法来取得基本数据类型的值,因此自动拆箱可能会抛出NullPointerException异常。看下面的例子。,10.2 新的for/in循环形式,使用Java的软件工程师可能很羡慕使用JavaScript的工程师,因为JavaScript有一种很简单的循环方式:for(var i in objects),它可以遍历数组、集合、堆栈,甚至是对象的所有属性。现在Java 5.0也引入了这种样式的for/in循环形式,来更方便地遍历数组、集合。,10.2.1 遍历数组,数组是一种很常用的数据结构,在Java 5.0以前,常见的遍历数组的写法为:for(in

6、t i=0;iarray.length;i+)String s=arrayi;System.out.println();这是一种很简单的写法,也很容易读懂,不过在Java 5.0中遍历数组更简单。新的循环形式可以这样写:String array=a,b,c,d;for(String s:array)System.out.println(s);,10.2.2 遍历集合,这里的集合类指实现了Connection接口的类,比如List,Set,ArrayList,HashSet,Vector等。以List为例讲一下Java 5.0前后遍历集合方式的区别。遍历集合可以采用一种类似于数组的方式,使用si

7、ze()和get(index)方法。例如下面的代码片段:List list=new ArrayList();for(int i=0;ilist.size();i+)Object obj=list.get(i);System.out.println(obj);,10.2.3 for/in循环示例,JForInArray.javapackage com.book.ch10.java5;import java.util.ArrayList;import java.util.List;public class JForInArray public static void main(String arg

8、s)String array=a,b,c,d;for(String s:array)System.out.println(遍历数组:+s);List list=new ArrayList();list.add(A);list.add(b);list.add(C);list.add(D);for(String obj:list)System.out.println(遍历集合:+obj);,10.3 可变长参数方法,在Java 5.0及以后的版本中,可以使用可变长度的参数来定义或者调用一个方法。这种方法被称为可变长参数方法(Varargs Method)。Java 5.0中新添加的System.o

9、ut.printf()方法以及String类的format()方法都是可变长参数方法。,10.3.1 定义可变长参数方法,先看一下Java 5.0中JDK里的可变长参数方法。例如,String类新增加的format()方法是这样定义的:public static String format(String format,Object.args)。定义一个可变长参数方法是在参数类型的后面加上省略号(.),然后加上可变长参数名。可变参数在方法内部表现为数组,可以使用传统的数组遍历方式来使用数组,也可以使用新特性for/in循环形式。例如,一个自定义的取平均数的方法:public static dou

10、ble avg(double.values)double total=0;int count=values.length;for(double i:values)total+=i;return total/count;,10.3.2 可变参数方法示例,下面的方法不仅示例了如何声明并调用一个可变长参数方法,还简单演示了Java 5.0中新增的System.out.printf()方法的使用,这是一个系统内置的可变长参数方法。参数中的%s表示输出一个字符串,内容就是后面的可变长参数的第一项,%n表示输出一个回车符,根据平台的不同而不同,例如在Windows上是rn,而在unix上是n。,10.4

11、协变式返回类型,10.4.1 概述,协变式返回类型(Covariant Return Types)允许在覆盖父类方法的时候,使父类方法的返回值更加具体。例如,ArrayList类的get(int index)方法返回的是Object,继承ArrayList之后就可以覆盖get方法,并修改返回值为String,因为String也是Object的一个子类。在Java 5.0版本之前,这是不允许的。,10.4.2 一个实例,下面的例子继承了ArrayList,覆盖了父类的get()方法。父类get()方法返回的是Object,这里改成了String。,10.5 静态导入,10.5.1 概述,Java

12、 5.0以后的版本支持使用静态导入(import static)导入某个类的静态方法和静态变量,在使用的时候不需要再指明类名,直接应用变量名或者方法名即可。import static为新增的一个指令。,10.5.2 一个实例,下面看一个静态导入变量与方法的例子。,10.6 范型,范型(Generic)是Java 5.0最重要的新特征之一。合理地使用范型可以简化很多工作,前面的协变式返回类型特性就是基于范型实现的。,10.6.1 概述,类与方法都可以被范型化。类范型由类名后面跟上一个或几个由三角括号包含的类型变量组成;方法范型主要体现在返回类型与方法内部;Java中的集合类已经被范型化了。例如,

13、ArrayList的类范型与方法范型如下:public class ArrayList extends AbstractList implements List,RandomAccess,Cloneable,java.io.Serializable.public E get(int index).,10.6.2 使用多个范型,有时容器里需要同时放置多个Object。比如HashMap,必须同时放置key与value两个Object,它们成对出现,而且两个Object的类型还可能不一致,这种情况下怎么使用范型来约束HashMap类呢?JDK5.0已经把HashMap范型化了。下面看一下JDK中H

14、ashMap的部分源代码:public class HashMap extends AbstractMap implements Map,Cloneable,Serializable.public V put(K key,V value)./代码略.public V get(Object key)./代码略.,10.6.3 范型通配符,范型支持通配符。通配符(wildcard)使范型用起来更加灵活。由于通配符的不确定性,通配符只能用来进行类型安全检查,而不能用来声明具体的类范型。范型允许使用通配符问号(?)。(?)代表任何类型。例如 List list,表示List里放置任何类型。不过单独使用

15、(?)基本上没什么用,(?)一般与extends和super连用。(?)与extends连用表示指定类型及其所有子类。(?)与super连同表示指定类型及指定类型的所有父类。由于通配符仅能用来进行类型安全检查,而不能用来声明具体的范型类,因此下面的通配符用法是错误的:List list=new ArrayList();/编译错误:Cannot instantiate the type ArrayListList list2=new ArrayList();/编译错误Cannot instantiate the type ArrayList,10.6.4 范型化类与方法,范型是一种很有力的工具,

16、因此在项目中要多加利用。本小节讲述如何构建自己的范型类与范型方法。范型化一个类或者范型化一个方法都需要使用三角括号定义一个范型类型。定义该范型类型的时候可以使用extends等,但不可以使用通配符(?)。范型类型的命名规则与类的命名规则一样,以大写字母开始。范型类型可以与Java中的类重名,但不推荐这么做。一般使用比较简单的字符串表示范型类型,如E、T、K、V等。范型化一个类与范型化一个方法稍稍不同。范型化一个类是在类名的后头定义范型类型,而范型化一个方法需要在方法名的返回类型前头定义范型类型。,10.7 枚举类型,在Java中,可以使用关键字class来声明一个类,使用interface来声

17、明一个接口。从Java 5.0开始,又引进了关键字enum和interface,分别用来声明一个枚举与一个注释。关于注释本章稍后会讲到,先来看一下enum枚举类型。,10.7.1 概述,枚举类型(Enumerated Types)是用enum声明的,看起来像数组的一组值。例如,下面的代码就声明了一个枚举类型Sex。枚举类型不能声明在方法内部,而只能声明为类变量。public enum Sex MALE,FEMALE,UNKNOWN,;枚举类型里的变量是实实在在的对象。可以把MALE,FEMALE,UNKNOWN看作是一种内部匿名类对象,并且它们是public(可以在Sex外部引用),stati

18、c(可以由类名Sex直接引用),final(引用不可修改)的。下面的程序演示了枚举类型的常用操作。可以看到枚举类型跟class、interface一样拥有方法。,10.7.2 枚举类型的用处,在实际项目中,常常会遇到一些常量,比如性别等。一般习惯上都是将常量定义成一个public static final的int值,放在类的前面,即方便又直观。但是当这种常量类型比较多时,就容易引起混乱。比如下面的雇员类,就有两种常量sex和type,都定义成了int变量放在类的前面。,10.7.3 扩展枚举类型,enum同interface、class一样是一种对象,因此它可以扩展、添加属性或者方法。跟int

19、erface不能有构造函数一样,enum也有一些限制:enum内部可以有构造方法,但不能有public的构造方法。enum内置对象间必须使用逗号隔开,声明完所有的内置对象之后用分号结束。enum内置对象必须使用声明的构造函数,否则编译错误。,10.8 注解,注解(annotation)功能十分强大,早在Java 5.0发布之前就有诸多开源项目中使用注解,比如XDoclet框架,EMF框架等。Java也使用内置的注解导出document。Java 5.0版本正式推出了注解功能(annotation)。Java 1.4之前的annotation都是写在注释里的,因此即使编译器不认识annotati

20、on也不影响程序的编译运行。Java 5.0版本的annotation已经脱离了注释,与class、interface、enum一样用来声明一类对象。如果编译器不支持会发生编译错误。,10.8.1 概述,注解(annotation)是以开头的一种标记,用来修饰包、接口、类、属性、方法和变量等。包含在注释里的信息以key=value属性对的形式提供给程序元素。下面是符合Java EE5.0规范的一个带annotation的Java Bean。,10.8.2 Java标准注解,上面例子中的注解是EJB3的注解。Java 5.0中也声明了几个常用的注解供编译器使用。这里简单讲述以下3种注解:Over

21、ride、Deprecated和SuppressWarnings。Override 覆盖Override是一种标记注解(就是不包含任何注解属性的注解),表示覆盖父类的方法。该注解只能用来标记方法,而不能标记其他程序元素。如果一个方法被标记为Override,编译器会检查该覆盖方法是否合法。如果父类中没有此方法,或者方法的参数不完全一致,则编译器报错。Deprecated 不赞成Deprecated也是一种标记注释,表示不推荐使用被注解的元素,该元素在未来的版本中可能会被取消,或者有更好的元素替代该方法。Deprecated可以注解类、方法以及属性。一个程序元素如果被标记为Deprecated,

22、编译器会显示一条警告信息,比如Date类型的getDate()方法被标记为Deprecated,如果使用该方法,编译器会警告:The method getDate()from the type Date is deprecated。,10.8.3 自定义注解,注解(annotation)与反射(reflection)是Java的两个重要特性,二者如果结合在一块使用功能将十分强大。在企业级Java平台(JavaEE platform)上,已经有基于这两种技术的产品发布了,EJB3就是其中一种。下面自定义一个annotation。Annotation可以看作是一种特殊接口。它使用interface作为声明annotation的关键字。下面看一个简单的例子。,10.9 小结,本章讲述了Java 5.0的8个新特性,其中的某些特性来自Java开源社区。自动装箱拆箱、新的for/in循环形式、可变长参数方法及静态导入等方便了Java的编程工作,把一些琐碎的工作交给了编译器;范型、枚举类型、注解等大大加强了Java的功能。熟练掌握这些特性势必对项目的开发有很大的帮助。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号