Java语言程序设计实验指导》电子教案第11章.ppt_第1页
Java语言程序设计实验指导》电子教案第11章.ppt_第2页
Java语言程序设计实验指导》电子教案第11章.ppt_第3页
Java语言程序设计实验指导》电子教案第11章.ppt_第4页
Java语言程序设计实验指导》电子教案第11章.ppt_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Return,第11章 常用工具包和类,11.1 Java常用工具包 11.2 简单类型包装器 11.3 Object类 11.4 Class类 11.5 Package类 11.6 Runtime类 11.7 System类 11.8 Math类,本章将介绍Java语言中的常用工具包和类。这些工具包和类在编程过程中经常用到,有些甚至是必不可少的,如java.lang包、System类等。熟练掌握本章所介绍的系统工具包和系统类,将为进一步学习Java编程打下良好的基础。,Return,11.1 Java常用工具包,在Java中,系统提供了大量的包以满足面向对象、网络化、编程的需要。本节将对一些常用的工具包作简要介绍。,11.1.1 Java API 包 11.1.2 java.lang,11.1.1 Java API 包,在Java 1.0被发布时,它包括一系列的8个包,被称作核心应用编程接口(API)。其中许多包在前面的章节中我们已介绍过,而且编程时经常用到。现在,每当发布一个Java新版本时,都会增加一些核心API,当然还有其他一些有用的工具包。在J2SE 1.2版本中,60个包总共提供了1781个公共类和接口;在J2SE 1.3版本中,70多个包提供的公共类和接口超过2100个;在J2SE 1.4版本中,120多个包提供了总数超过2600个的公共类和接口。 以下是一些经常用到的工具包: l 语言包(java.lang)提供的支持包括字符串处理、多线程处理、例外处理、数学函数处理等,可以用它简单地实现Java程序的运行平台; l 输入输出包(java.io)使用统一的“流”模型来实现所有格式的IO,包括文件系统、网络传输、输入/出设备等; l 实用程序包(java.util)提供的支持包括哈希表、堆栈以及时间和日期等; l 抽象窗口工具集包(java.awt)实现了不同平台上的计算机图形用户接口部件,包括窗口、菜单、滚动条、对话框等,使得Java可以移植到不同的运行环境; l 网络包()支持Internet的TCPIP协议,提供了与Internet的接口。它支持URL连接,WWW的即时访问,并且简化了C/S(客户/服务器)模型的程序设计。 另外比较常见的Java包还有:java.math、java.sql、java.text、java.rmi、java.beans以及java.security等。教材P268页中的表11-1,列出了所有被Java 2定义的Java核心API包并对它们作了简要描述。,Return,11.1.2 java.lang,其实,我们前面章节编写的每个Java程序都与java.lang有关。但之所以没说明,是因为java.lang被自动导入所有的程序。它所包含的类和接口对所有Java程序都是必要的,是Java中最广泛使用的包。 教材P269页给出了java.lang中主要包括的类。 另外,还有两个由Character定义的类:Character.Subset和Character.UnicodeBlock,它们是在Java 2中新增加的。 java.lang中也定义了如下的接口: l Cloneable接口 l Comparable接口 l Runnable接口 其中,Comparable接口是在Java 2中新增加的。 java.lang中的几个类包含了过时的方法,其中的大多数可以追溯到Java 1.0。在Java2中仍然提供了这些方法,用于支持逐渐减少的老程序,而这些方法在新程序中不被推荐使用。大多数过时的方法出现在Java 2之前,因此我们不准备讨论这些方法。,Return,Return,11.2 简单类型包装器,11.2.1 Number 11.2.2 DoubleFloat 11.2.3 Byte、Short、Integer和 Long 11.2.4 Character 11.2.5 Boolean类 11.2.6 关于Vector 11.2.7 Void和Process,在教材2.3节中我们提到过,Java使用简单的类型,如整型(int)、字符(char)等数据类型不是对象层次结构的组成部分,它们通过值传递给方法而不能直接通过引用传递。而且也没有办法使两种方法对整型(int)引用同一实例(same instance)。但是,有时需要对这些简单的类型建立对象表达式,如处理对象的枚举类,要将简单类型存储到这些类中的一个,需要在类中包装简单类型。为了满足这种需要,Java提供了与每一个简单类型相对应的类。从本质上讲,这些类在类中包装简单类型,因此通常被称作类型包装器(wrappers)。,Return,11.2.1 Number,抽象类Number定义了一个由包装数字类型字节型(Byte)、短整型(Short)、整型(Int)、长整型(Long)、浮点型(Float)和双精度型(Double)的类实现的超类。Number有返回上面不同数字格式的对象值的抽象方法。也就是,doubleValue()方法返回双精度(Double)值,floatValue()方法返回浮点(Float)值等。这些方法如下: byte byteValue() double doubleValue() float floatValue() int intValue() long longValue() short shortValue() Number有6个具体的子类包含了6种数字类型的显式值:双精度型(Double)、浮点型(Float)、字节型(Byte)、短整型(Short)、整型(Integer)和长整型(Long)。,11.2.2 DoubleFloat,双精度(Double)和浮点(Float)分别是对类型double和类型float的浮点值的包装器。浮点(Float)构造函数如下所示: Float(double num) Float(float num) Float(Stringstr)throw NumberFormatException 如上可见,浮点(Float)对象可以由类型float或类型double的值创建。它们也能由浮点数的字符串表达式创建。 双精度(Double)的构造函数如下。 Double(double num) Double(String str) throw NumberFormatException 双精度(Double)对象可以被双精度(Double)值或包含了浮点值的字符串创建。浮点(Float)和双精度(Double)都定义了一些常数,这些常数见教材P270页。 由浮点(Float)定义的方法见教材P271页表11-2。由双精度(Double)定义的方法见教材P271页表11-3。,Return,11.2.3 Byte、Short、Integer和 Long,Byte、Short、Integer和Long类分别是字节型(byte)、短整型(short)、整型(int)和长整型(long)整数类型的包装器。它们的构造函数分别如下: Byte(byte num) Byte(String str) throw NumberFormatException Short(short num) Short(String str) throw NumberFormatException Integer(int num) Integer(String str) throw NumberFormatException Long(long num) Long(String str) throw NumberFormatException 正如上所示,这些对象可由数值或含有有效整数值的字符串创建。 下面讨论如何进行数字和字符串的转换问题。在程序设计中,一个最常见的问题是将一个数字的字符串表达式转换成内部的二进制格式。Java为此提供了一个方便的方法去完成这项任务。Byte、Short、Integer和Long类分别提供了parseByte()、parseShort()、parseInt()和parseLong()方法。这些方法返回与调用它们的数值字符串相应的字节(byte)、短整型(short)、整型(int)和长整型(long)值。在Float和Double类中也有相似的方法。教材P274页的程序说明了parseInt()方法的使用。,Return,11.2.4 Character,字符(Character)是围绕字符型(char)的一个简单的包装器。字符(Character)的构造函数如下: Character(char ch) 这里,ch指定了被创建的字符(Character)对象所包装的字符。 调用如下的charValue()方法可以获得包含在字符(Character)对象中的字符型(char)值。 char charValue() 调用的结果返回字符。字符(Character)类定义的常数见教材P275页。 字符(Character)包括了几个静态方法,这些方法将字符分类并改变其大小写。这些方法见教材P275276页表11-4。关于这些方法的使用见教材P276页的示例。,Return,11.2.5 Boolean类,Boolean是一个围绕布尔(boolean)值的非常细小的包装器,主要用在通过引用传递布尔(boolean)变量的场合。它包含了常数TRUE和FALSE,这些常数定义了布尔(Boolean)对象的真与假。Boolean也定义了TYPE域,它是boolean的Class对象。在Boolean中定义了如下的构造函数: Boolean(boolean boolValue) Boolean(String boolString) 在第一种形式中,boolValue要么是true,要么是false。在第二种形式中,如果在boolString中包含了字符串“true”(无论是大写形式还是小写形式),则新的布尔(Boolean)对象将为真,否则为假。Boolean定义了教材P277页表11-5中所列出的方法。,Return,11.2.6 关于Vector,向量(Vector)是由java.util包提供的,它允许提供不同类型元素共存的变长数组。Vector类的特点如下。 l 需要处理的对象数目不定,序列中的元素都是对象,或者可以表示成对象。 l 需要将不同类的对象组合成一个数据序列。 l 需要做频繁的对象序列中元素的插入和删除。 l 经常需要定位序列中的对象或其他查找操作。 l 在不同的类之间传递大量的数据。 其局限性是对象不能是简单类型,但这可以通过数组(Array)实现。 (1)创建向量类的对象: public Vector(int initCapacity, int capacityIncrement); 其中,initCapacity表示刚创建时Vector序列包含的元素数目,capacityIncrement表示如果向Vector序列中加元素,一次性加多少个。 (2)向向量序列中加元素: addElement(Object obj) insertElement(Object obj, int index) (3)修改和删除向量序列中元素: setElementAt(Object obj, int index) removeElement(Object obj) removeElementAt(int index) removeAllElements() (4)查找向量序列中元素: elementAt(int index) contains(Object obj) lastIndexOf(Object obj, int start_index),Return,Return,11.2.7 Void和Process,Void类有一个TYPE域,该域保存对类型void的Class对象的引用。这样做将不创建类的实例。 抽象类Process封装了一个进程(process),也就是一个正在执行的程序。它主要被当作由Runtime类中的exec()方法所创建的对象的类型的超类。Runtime类将在后面介绍。在抽象类Process中,包含了教材P278页表11-6中所列出的抽象方法。,Return,11.3 Object类,11.3.1 Object 11.3.2 使用clone()和Cloneable接口,这里大致介绍一下Object类。在Java中,定义有一种特殊的类Object,其他所有的类都是Object的子类。也就是说,Object是所有其他类的超类。这意味着一个Object类型的引用变量可以引用其他任何一个类的对象。同样,因为数组像类一样执行,Object类型变量可以引用任何数组。,Return,11.3.1 Object,Object定义了教材P279页表11-7的方法,意味着它们可以被用于任何对象。这些类方法对于每一个对象都是可引用的。 其中,getClass()、notify()、notifyAll()和wait()方法被定义成final。你可以重载除这些方法以外的其他方法。 注意这两个方法:equals()和toString()。 equals()方法比较两个对象的内容。如果对象是相等的,它返回true,否则返回false。 toString()方法返回一个包含调用它的对象描述的字符串。而且,该方法在对象使用println()输出时自动调用。很多类都重载该方法,这样做使它们生成它们创建对象类型的一个特殊描述。,11.3.2 使用clone()和Cloneable接口,由Object类定义的绝大部分方法在本书其他部分讨论。而一个特别值得关注的方法是clone()。clone()方法创建调用它的对象的一个复制副本。只有那些实现Cloneable接口的类能被复制。 Cloneable接口没有定义成员。它通常用于指明被创建的一个允许对对象进行位复制(也就是对象副本)的类。如果试图用一个不支持Cloneable接口的类调用clone( )方法,将引发一个CloneNotSupportedException异常。当一个副本被创建时,并没有调用被复制对象的构造函数。副本仅仅是原对象的一个简单精确的拷贝。 复制是一个具有潜在危险的操作,因为它可能引起不是你所期望的副作用。例如,假如被复制的对象包含了一个称为obRef的引用变量,当副本创建时,副本中的obRef如同原对象中的obRef一样引用相同的对象。如果副本改变了被obRef引用的对象的内容,那么对应的原对象也将被改变。这里是另一个例子。如果一个对象打开一个I/O流并被复制,两个对象将可操作相同的流。而且,如果其中一个对象关闭了流,而另一个对象仍试图对I/O流进行写操作的话,将导致错误。 由于复制可能引起问题,因此在Object内,clone( )方法被说明为protected。这就意味着它必须或者被由实现Cloneable的类所定义的方法调用,或者必须被那些类显式重载以便它是公共的。分析教材P280281页的例子。,Return,11.4 Class类,Class封装对象或接口运行时的状态。当类被加载时,类型Class的对象被自动创建。不能显式说明一个类(Class)对象。一般地,通过调用由Object定义的getClass( )方法来获得一个类(Class)对象。由Class定义的一些最常用的方法见教材P282页表11-8所示。 由Class定义的方法经常用在需要知道对象的运行时类型信息的场合。如上表中所说明的那样,由Class提供的方法确定关于特定的类的附加信息。例如它的公共构造函数,域以及方法。教材P283页的程序说明了getClass()(从Object继承的)和getSuperclass()方法(从Class继承的)。,说明:关于ClassLoader的问题:抽象类ClassLoader规定了类是如何加载的。应用程序可以创建扩展ClassLoader的子类,实现它的方法。这样做允许使用不同于通常由Java运行时系统加载的另一些方法来加载类。由ClassLoader定义的一些方法见教材P283页表11-9。,Return,11.5 Package类,在Java 2中,增加了一个称为Package的类,这个类封装了与包有关的版本数据。关于包版本信息,由于包的增值以及由于Java程序可能需要知道哪些包版本可以利用,而变得更加重要。Package中定义的方法见教材P284页表11-10所列。 教材P284页的程序通过显示程序当前已知的包而说明了Package的用法。,Return,11.6 Runtime类,11.6.1 内存管理 11.6.2 执行其他的程序,Return,Runtime类封装了运行时环境。一般情况下,不实例化一个Runtime对象,但是可以通过调用静态方法Runtime.getRuntime()而获得对当前Runtime对象的引用。一旦获得了对当前对象的引用,就可以调用几个控制Java虚拟机的状态和行为的方法。小应用程序(Applets)和其他不可信赖的编码由于没引起一个安全异常(SecurityException),故不能调用任何的Runtime方法。教材P285页表11-11给出了由Runtime定义的方法。Java 2中不建议使用方法runFinalizersOnExit(),这种方法是在Java 1.1中增加的,因为它现在被认为是一种不稳定的方法。 下面让我们来看一看Runtime类的两个最普遍的用法:内存管理和执行附加进程。,11.6.1 内存管理,尽管Java提供了自动垃圾回收,有时也想知道对象堆的大小以及它还剩下多少。可以利用这些信息检验你的代码的效率,或估计对某些类型,有多少对象可以被实例化。为了获得这些值,可以使用totalMemory()和freeMemory()方法。 正如我们在前面章节提及的,Java的垃圾回收器周期性地运行将不再使用的对象放入回收站。然而,有时想在收集器的下一个指定循环之前收集被丢弃的对象。如果这样可通过调用gc()方法按照要求运行垃圾回收器。一个比较好的策略是调用gc()方法,然后再调用freeMemory()方法以获得内存使用的底线。接着执行你的程序,并再一次调用freeMemory()方法看分配了多少内存。教材P286页的例子说明了这个思想。,Return,11.6.2 执行其他的程序,在可靠的环境中,可以在你的多任务操作系统中使用Java去执行其他特别繁重的进程(也即程序)。exec()方法的几种形式允许命名想运行的程序以及它们的输入参数。exec()方法返回一个Process对象,这个对象可以被用来控制你的Java程序如何与这个正在运行的新进程相互作用。因为Java可以运行在多种平台和多种操作系统的情况下,exec()方法本质上是依赖于环境的。教材P287页的第一个例子使用exec()方法装入Window的简单文本编辑器NotePad。显而易见,这个例子必须在Windows操作系统下运行。 exec()方法有几个形式可用,而在本例子中展示的是最常用的一种。在新程序开始运行之后,由exec()方法返回的Process对象可以被Process方法使用。可以使用destroy()方法杀死子进程。waitFor()方法暂停程序直至子进程结束。当子进程结束后,exitValue()方法返回子进程返回的值。如果没有问题发生,它通常返回0。教材P287页的第二个例子是前面关于exec()方法例子的改进版本。例子被修改为等待直至正在运行的进程退出。,Return,Return,11.7 System类,11.7.1 使用currentTimeMillis()方法 11.7.2 使用arraycopy()方法 11.7.3 环境属性,System类保存静态方法和变量的集合。标准的输入,输出和Java运行时错误输出存储在变量in,out和err中。由System类定义的方法见教材P288页表11-12中所示。 注意,当所做操作为安全方式所不允许时,许多方法引发一个安全异常(SecurityException)。同样,Java 2不赞成使用runFinalizersOnExit( )方法。该方法是在Java 1.1中增加的,同时也被证明是不可靠的。下面让我们看一看System类的一些用法。,11.7.1 使用currentTimeMillis()方法,可以发现System类的一个特别有意义的用法是:利用currentTimeMillis( )方法来记录程序的不同部分的执行时间。currentTimeMillis( )方法返回自从1970年1月1号午夜起到现在的时间,时间单位是毫秒。如果要记录程序中一段有问题程序的运行时间可以在这段程序开始之前存储当前时间,在该段程序结束之际再次调用currentTimeMillis( )方法。执行该段程序所花费的时间为其结束时刻的时间值减去其开始时刻的时间值。教材P289页的程序说明了这一点。,Return,11.7.2 使用arraycopy()方法,使用arraycopy()方法可以将一个任意类型的数组快速地从一个地方复制到另一个地方。这比使用Java普通语句编写的循环算法要快得多。教材P290页是一个用arraycopy()方法复制两个数组的例子。首先,将数组a复制给数组b;接下来,数组a中的所有元素向后移一位,然后数组b中元素向前移一位。,Return,11.7.3 环境属性,教材P290页的属性在Java 2的所有环境中可以使用。 可以通过调用System.getProperty()方法来获得不同环境变量的值。例如,下面的程序可显示当前用户目录的路径。 class ShowUserDir public static void main(String args) System.out.println(System.getProperty(“user.dir“); ,Return,Return,11.8 Math类,11.8.1 超越函数 11.8.2 指数函数 11.8.3 舍入函数 11.8.4 其他数学方法,Math类提供了进行复杂数学运算的一些途径,它保留了所有用于几何学、三角学以及几种一般用途方法的浮点函数。Math定义了两个双精度(double)常数:E(近似为2.72)和PI(近似为3.14)。,11.8.1 超越函数,下面的三种方法对一个以弧度为单位的角度接收一个双精度(double)参数并且返回它们各自的超越函数的结果。 static double sin(double arg):返回由以弧度为单位由arg指定的角度的正弦值; static double cos(dou

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论