0183《JAVA程序设计》2018年6月期末考试指导
发布时间:2023-11-17 11:11:36浏览次数:25《 程序设计》 年 月期末考试指导一、考试说明本课程为闭卷考试,考试时间为 90 分钟,考试题型和所占分数如下:、单项选择题(每小题 分,共 分)、填空题(每空 分,共 分)、程序填空题(每小题 分,共 分)、简答题(每小题 分,共 分)三、重要复习内容单元一 Java 简介1、 Java 系统的组成一个 Java 系统由以下几部分组成:环境,Java 语言本身,Java 应用程序接口(API),以及各种 Java 类库。2、 Java 程序Java 程序一般分为五个阶段来执行,即编辑、编译、载入、验证和执行。第一个阶段包括编辑一个文件。这里应该使用一个编辑程序,程序员利用这个编辑器输入一个 Java 程序并进行必要的错误检查。然后这个程序存放在一个二级存储设备(例如磁盘)上。Java 程序带有一个 Java 的文件后缀。第二个阶段,程序员采用 javac 命令来编译程序。Java 编译程序将 Java 程序转换成字节码Java 解释器能够理解的语言。如果要编译一个名为 Welcome.java 的程序,只需键入: javac Welcome.java。如果程序编译成功,将创建一个名为 Welcome.class 的文件。这个文件包含将在执行阶段解释的字节码。第三个阶段称为载入。程序在执行前必须首先放置到内存中。这个过程是由类载入器将一个或多个包含字节码的 c1ass 文件传输到内存来完成的。这些 class 文件可以在本地硬盘上,也可以通过网络载入。在两种情况下类载入器都能处理 class 文件。例如,命令“java Welcome”激活了 java 解释器,然后调用类载入器载入 Welcome 程序中使用的信息。Welcome 程序称为一个应用程序,应用程序就是 Java 解释器执行的程序。当一个 Java applet(小程序)由一个 WWW 浏览器(例如 Netscape 的 Navigator 或 Sun 的 HotJava)载入时,同样也要激活类载入器。当用户浏览一个包含 Java applet 的 HTML(超文本标识语言)文档时,将载入 Java applet。Java applet 还可以在命令行采用 Java 开发工具集提供的appletviewer 命令来执行,这个工具集包括编译器(javac)、解释器(java)、appletviewer 和其他 Java 程序员用到的工具。在两种情况下类载入器都能处理 class 文件。在 Java 解释器或 appletviewer 执行字节码之前,它们要在第四阶段由代码校验器进行验证。这样就保证了这些代码是合法的,并且不会破坏 Java 的安全性约束。由于 Java 程序在Internet 上传播,为了避免破坏用户的文件和系统,必须保证严格的安全性约束。最后是第五阶段,计算机在 CPU 的控制下逐字节地执行这个程序。3、算术运算算术运算符算术优先级规则4、条件判断相等运算符1
*,-.*/.*0&!//1$$/$2!. *3#. 下列关于 '(!* 类型的叙述中+正确的是。可以将 '(!* 类型的数值转换为 * 类型的数值可以将 '(!* 类型的数值转换为字符串可以将 '(!* 类型的数值转换为 %" 类型的数值 不能将 '(!* 类型的数值转换为其他基本数据类型 中类 4'!%4&&0! 支持对象的写操作,这是一种字节流,它的直接父类是。5! 4&&4&&0! 4'!%4&& $%" 语句( )。都可以用 67!($!6 结构实现都不可以用 67!($!6 结构实现有的可以用 67!($!6 结构实现 大部分不可以用 67!($!6 结构实现8 语言中,对当前对象的父类对象进行引用的关键字是( )。%$!$&!%" '!9 下列不是 2*&0!子类的是( )。文件输入流 :(!2*&0!对象输入流 4'!%2*&0!字符输入流 "2*&0! 压缩文件输入流 ;2*&0!< *型 &'(%成员变量 =-/>?@ABC+该值保持为常数 +则定义这个变量的语句是( )。&'(%*=-/>?@ABCD)*(*=-/>?@ABCD&'(%%*$*=-/>?@ABCD &'(%)*(*=-/>?@ABCD 语言中+下列标识符错误的是( )。/$E$F/2 *! 下列代码的编译或执行结果是。&'(%%($$=E(G&'(%$%#*0*1HI1$G10
=E(D*!=E(.=!"#.J&'(%#=!"#G'(!*HI'D*!(!*HI.0E$!&*(*'HI.JJ*&(( 编译错误 K 中提供的文档生成器是。!L!!L!#%!L! 6!L! 下列运算结果为 的是。MMMMMNN NNN 下列代码的执行结果是。**&'!$HID*!*HI.6*D.N*&'!$(!*1".OOG*&'!$HID7.0E$!&**&'!$HIO.J 在下列程序的空白处+应填入的正确选项是。.&((%%($$4'!%0!B!$G&'((%$%#*$*11$HI"$24?L%!*G4'!%4&&0!$D*!4'!%4&&0!*!:(!4&&0!$!('*.&( !#D*!&( !.$/////////////#.4'!%2*&0!$D*!4'!%2*&0!*!:(!4&&0!$!('*.EG&(#!!$!# !D&( !$!#4'!%.11
0E$!&*(*!#'!%'%96$!('*)(!PO!$!# !.J%%"($$@:&*#?L%!*%*6G0E$!&*(*%($$*6&*#.JJ5!4'!%!'&Q!!#5! !4'!% 下列常见的系统定义的异常中+( )是输入、输出异常。($$@:&*#?L%!*24?L%!*:(!@:&*#?L%!* R*9**C$?L%!*8 下列程序的功能是在监控台上每隔一秒钟显示一个字符串C!((S+能够填写在程序中下划线位置+使程序完整并能正确运行的语句是( )。&'(%%($$B!$(!!*$T&**'(!G&'(%$%#*0*11$HIGB!$D*!B!$.B"!#D*!B"!#.$.J&'(%#&*G6..GEG////.J%%"////!GJ0E$!&*(*C!((.JJJ$(!!2*!&!#?L%!*$(!!2*!&!#?L%!*B"!#$(!!T&*!?L%!* B"!#$(!!2*!&!#?L%!* 阅读下列代码&'(%%($$B!$8G&'(%$%#*0*11$HIG12
0*1$DB!$.0%"$G%$!P0E$!&*.'!9.%$!>*1&1!P0E$!&*>*1&1!.'!9.%$!B!$P0E$!&*B!$.'!9.JJJ其运行结果是( )。>*1&1!B!$ 编译出错< 为使下列代码正常运行+应该在下划线处填入的选项是( )。4'!%2*&0!*D*!/////*!:(!2*&0!!(E!!#.?(E!!HI*!0QD?(E!!HI*!#4'!%.*%2$!.T!#!2*&0!4'!%2*& 4'!%2*&0! 下列程序的输出结果是( )。&'(%%($$B!$G&'(%$%#*0*1HI1$G*HIEDG++++J.*$U!D.*!$&(D7.EG6*D.N$U!FF!$&(DD7.OO6EHIDD!$&(D.J%%""!%?L%!*!G0E$!&*(*%"777.J%%"E2*#!L4&46&*#$?L%!*!G0E$!&*(*%"777.J%%"?L%!*!G0E$!&*(*%"777.JJ13
%"777%"777%"777 以上都不对参考答案:AADDC、AB CD D DCBCD BDCBB(二)填空题 的线程调度策略是一种基于 的抢占式调度。 当使用 B"!#D*!B"!#创建一个线程时+表达式P*$*%!6B"!#的值为。 任何一个 程序都默认引入了一个包+这个包的名字叫 。 若有 *D+'D.表达式 'DOOOOOOOO的值是 。 是面向对象语言+对象是客观事物的 +对象与之是一一对应的+它是很具体的概念。 :(!2*&0! 是字节流+&Q!!#5! 是字符流,4'!%4&&0! 是/////////////。8 继承性是面向对象方法的一个基本特征+它使代码可/////////////////。 中的返回语句是/////////////////语句。< /////////////////类在定义数组时,不必限定数组的大小。 在面向对象方法中,/////////////////描述的是具有相似属性与操作的一组对象。参考答案:1. 优先级;2.false;3. Lang;4. 9;5.实体;6.对象流或对象输出流;7.重用;8.return; 9.ArrayList;10.类(三)程序填空题 下列程序创建了一个线程并运行+请在下划线处填入正确代码。&'(%%($$BE!L!*#$B"!#G&'(%$%#*0*11$HIGB"!#D*!BE.////////////J&'(%#&*G0E$!&*(*BES.JJ 下列代码的执行结果是////////////。&'(%%($$?L!$$*G&'(%$%#*0*1HI1$G*D+D<<+D.0E$!&*(*NFFVDD.14
JJ 下面程序的运行结果是/////////////////。.&'(%%($$G&'(%$%#*0*11$HIG*.*HIDG++++++88++<<J.6D.ND(!*1"V.OO0E$!&*HIOH(!*1"77IO.0E$!&*(*.JJ 请阅读下列程序代码+然后写出程序的执行结果。&'(%%($$"$?L%!*G$%#W%*$!("$"!%?L%!*+E2*#!L4&46&*#$?L%!*G0E$!&*(*2*0&*O$!(.6$!(DDG0E$!&*(**?L%!*%&1".!&*.J!($!6$!(DDG*EHID*!*HI.EHID.JJ&'(%$%#*0*11$HIGEGW%.W%.J%%"E2*#!L4&46&*#$?L%!*!G0E$!&*(*%"O!.J)*((EG0E$!&*(**W%)*((E.JJJ执行结果P////////////////////////////////////////////////////////////////////////////////////15
参考答案:1. t.start();2. false3. 100 100 100 100 1004. In.Situation() (四)简答题 在 中一个类被声明为 )*( 类型,则该类有何特性?回答提示:表示该类不能被继承,意味着它不能再派生出新的子类,不能作为父类被继承,是顶级类。 语句 $"$D.$OD.是否有错?为什么?回答提示:错误。因为 s1 是 short 型而 1 是整型相加后数据类型就变为整型了,与 s1 定义为 short 型有矛盾,必须进行强制类型转换才正确。 数组和字符串是否有 (!*1"方法,是否有 (!*1" 属性?回答提示:数组没有 length()方法,String 有 length()方法?数组有 length 属性,String 没有length 属性。 当一个对象被当作参数传递到一个方法后,如何判断是值传递还是引用传递?回答提示:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,则是引用传递说明:本考试指导只适用于 201803 学期 6 月期末考试使用,包括正考和重修。指导中的章节知识点涵盖考试所有内容,给出的习题为考试类型题,习题答案要点只作为参考,详见课程讲义或课程 ppt。在复习中有任何问题请到课程答疑区咨询。祝大家考试顺利!16
关系运算符单元二 Java 应用程序单元三 JavaApplet(重点)从 java.applet.Applet 或者 javax.swing.JApplet 类派生出来的类,即小应用程序,小应用程序可以嵌入 HTML 页面,被 Web 浏览器动态下载、执行。单元四 控制结构单元五 JAVA 方法1、 Java 中的程序模块Java 中的模块称为方法(method)和类(class)。Java 程序是通过将程序员编写的新方法与JavaAPI(也称为 Java 类库)中“预打包”(pre-packaged)的方法相组合,以及将程序员编写的新类与 Java 类库中“预打包”的类相组合而形成的。2、 方法(重点)方法允许程序员模块化一个程序。所有在方法定义中声明的变量均为局部变量它们仅在定义的方法中可见。大多数方法都有一个形式参数表,从而提供了方法间交换信息的手段。方法的参数也是局部变量。使用方法来模块化程序有几个目的。首先,“分而治之”,各个击破的方法使得程序的开发更好管理。另一个目的是软件的可重用性,可以将现有的方法作为构件块来创建新的程序。只要使用良好的方法命名和定义,程序便可以通过标准方法进行创建,而不必使用用户化的代码。第三个目的是避免程序中的重复代码,将代码作为一个方法打包起来,这样在程序的其他地方执行这些代码时,只需简单地调用该方法即可。3、 参数类型提升方法定义的另一个重要特征是参数的强制类型转换(coercion of argument),即强制参数成为传递到方法中的合适类型。提升规则适用于包含两个或更多数据类型的表达式,这样的表达式也称为混合类型表达式混合类型表达式中每个值的类型都将提升为表达式中的“最高”类型(实际上创建每个值的临时版本并用于表达式,即原始值保持不变)。4、 Java API 软件包(重点)Java 包含许多称为类的预定义程序段,它们在磁盘上按目录分组,从而形成相关类的分类,通常称之为软件包。综合来说,这些软件包称为 Java 应用程序编程接口(Java APl)或 Java 类库(Java class library)。5、 自动变量变量的属性包括名字、类型、存储大小和值。程序中每个标识符都有其他的属性,包括生存期(duration)和作用域(scope)。标识符的生存期(也称生命周期)决定了它在内存中的存在周期。一个标识解符的作用域是在程序中可以引用的范围。6、 作用域规则(重点)标识符的作用域是指在程序中的某一部分可以引用标识符。一个标识符的作用域有类作用域(class scope)和块作用域(block scope)之分。在 break 和 continue 语句中还有一种用于标签的特殊作用域,标签只在紧跟其后的循环结构体中可用。一个类的方法和实例变量有类作用域,类作用域从类定义的左花括号({)开始,并在类定义的右花括号(})处结束。类作用域使一个类的方法能直接激活在同一个类中定义的方法或继承的方法,并且使之能直接访问在类中定义的所有实例变量。在块内声明的标识符具有块作用域。块作用域在标识符声明的地方开始,并且在块的右花括号处结束。在方法开始处声明的局部变量的块作用域同方法的参数一样,参数也是方法的局部变量。任何块都可以包含变量声明,当块有嵌套时,如果外层块的标识符与内层块2
的标识符同名,编译器,会生成语法错误,表明该变量已经定义过了。如果方法中的局部变量与实例变量同名,则实例变量,将“隐藏”起来直到块结束执行为止。7、 递归递归方法就是直接或间接调用自己的方法。8、 Applet 类的方法在 applet 执行时自动调用的 Applet 方法有:public void init(), public void start(), public voidpaint(Graphics g), public void stop(), public void destroy()。单元六 数组1、 数组数组是包含相同类型的相关数据项的数据结构。数组是“静态”的实体,这是因为数组创建后的大小将保持不变,不过一个数组引用可以重新赋值为一个新的、不同大小的数组。2、 声明数组和分配数组数组要占据存储空间。在 Java 中,使用 new 运算符来动态分配对象。声明数组时,程序员先定义元素的类型,然后使用 new 运算符分配数组所需的空间,例如: int c[ ] = new int[ 12];上面的语句也可以分成两步来执行:, int c[ ];//declares the array c=new int[12];//allocates the array为数组分配空间以后,其元素将自动初始化。如果初始化为基本数据类型,则为 0 值;布尔类型则为 false;引用类型(以及其他非基本类型)则为 null(空)。与在其他编程语言(例如 C或 C++)中声明数组不同,Java 数组的元素个数不能在数组名后的方括号中定义,否则将导致语法错误。例如,声明“int c[12];”会产生语法错误。声明数组时,可以将数组的类型和方括号放在声明语句的开头,以指出数组声明中的所有标识符,例如: double[ ] arrayl,array2;3、 引用和引用参数Java 不像其他语言,它不允许程序员选择是按值调用还是按引用调用来传递每个参数。基本数据类型变量通常按值调用传递,而对象则通过按引用调用传递。引用本身是通过按值调用传递的,即将引用的副本传递给方法。当方法接收一个对象的引用时,可以直接处理该对象。由于在 Java 中数组也被视为对象,因此数组是通过按引用调用方式传递的,即—个被调用的方法能够访问调用者的原始数组中的元素。一个数组的名字实际上就是对一个对象的引用,对象包含数组元素以及 length 实例变量,用以指明数组中元素的个数。4、 多维数组带有两个下标的多维数组常常用于表示按行和列排列的信息值。为了标识一个列表元素,我们必须规定两个下标:第一个标识元素的行(习惯用法),第二个指明元素的列。需要两个下标来标识某一特定元素的表或数组称为二维数组。注意,多维数组可以拥有两个以上的下标。Java 并不直接支持多维数组,但允许程序员定义其元素也是单下标数组的单下标数组,从而实现同样效果。多维数组可以像一个单下标数组那样初始化。一个二维数组b[2][2]可以利用下列语句进行声明和初始化: int b[ ][ ] = { {1,2},{3,4} };元素值按行分组并由花括号括起来。单元七 基于对象的编程(重点)1、 面向对象的概念3
面向对象的编程(OOP)将数据(属性)和方法(行为)封装到对象中,对象的数据和方法紧密地结合在一起。对象具有信息隐藏的性质,这说明尽管对象可能知道如何通过正确定义的接口同其他对象进行通信,但一般不允许对象知道其他对象是如何工作的实现的细节隐藏在对象的内部。2、 类作用域一个类的实例变量和方法属于该类的作用域(scope)。在类的作用域中,类的方法可以直接引用类的成员,只需简单地引用其名字即可。在类的作用域之外,不能直接使用名字来引用类的成员。3、 控制对成员的访问成员访问修饰符 public 和 private 用于控制对类的实例变量和方法的访问。public 方法的主要目的是为类的客户展现类所提供的服务(service)的视图,即类的公有接口。类的客户不需要关心类是如何完成其任务的,由于这个原因,类的客户不能访问类的 private 方法和Private 实例对象(即类的实现细节)。对 private 数据的访问由类的方法小心地控制。例如,为了允许客户读取 private 数据值,类可以提供一个 get(获取)方法(也称为访问方法)。为了使客户能够修改 private 数据,类可以提供一个 set(设置)方法(也称为修改方法)。这种修改似乎破坏了 private 数据的原有概念,但是 set 方法能提供数据验证的功能(如范围检查),以保证合法地设置该值;同时,set 方法可以在接口中使用的数据格式和实现中使用的数据格式之间进行转换。get 方法无需使用“原始”格式展现数据;不仅如此,get 方法还能够编辑数据并限制客户将要看到的数据的视图。4、 初始化类对象:构造函数构造函数是一个与类同名的方法,程序员提供了构造函数,每次实例化类的对象时都将自动调用该构造函数。构造函数不能定义返回类型或返回值。可以重载构造函数,从而为类的初始化提供多种方法。5、 软件可重用性单元八 面向对象的编程1、 继承和多态(重点)继承是软件重用的一种形式,这种技术通过包含现有类的属性和行为来创建新类,并通过新类的功能来丰富现有类。软件重用节省了程序开发时间,鼓励程序员重用那些经过证明和调试的高质量软件,从而减少系统投入运行后所带来的问题。当创建一个新类时,程序员可以指明新类将继承以前定义为超类(superclass)的实例变量和实例方法,而不是写出所有的新实例变量和新实例方法。新的类称为子类(subclass),每个子类也可成为其他类的超类。子类的直接超类(direct superclass)是子类现式继承的超类,间接超类是在类层次中从两层或更多层次之外继承的超类。单继承(single inheritance)指一个类派生于一个超类。多态使得我们可以按照通用的风格来编写程序,此处理一大批现有的以及还未说明的相关类的对象,并且很容易向系统添加新的功能。继承和多态都是处理软件复杂性的有效技术。2、 protected 成员protected 访问是介于 public 访问和 private 访问之间的一种中间保护形式,超类的 protected成员可以由该超类的方法访问,也可以由其子类的方法和同一个软件包内其他类的方法访问。正常情况下,子类的方法使用成员名就可以访问其超类的 public 和 protected 成员。当子类的方法覆盖了超类的方法时,子类可以通过在超类名前加上 super、后跟句点运算符(.)的方式来访问超类的方法。3、 final 方法和类(重点)4
变量声明为 final,表明它们在声明之后不能再修改,它们必须在声明时初始化。也可以使用 final 修饰符来定义方法和类。不能在子类中重写声明为 final 的方法,标明为 static 和private 的方法都隐含了 final 限定。由于—个 final 方法的定义不能再更改,因此编译器可以删除对 Final 方法的调用,并在每个方法调用的位置使用其定义的扩展代码来替换它们,从而优化了程序。这是一种称为内联代码(inlining the code)的技术。声明为 final 的类不能成为超类,即不能继承 final 类,final 类中的所有方法隐含地都为 final 类型。4、 抽象超类和具体类在某些情况下,对于不想实例化任何对象的程序员而言,也可以定义具有这种特点的类。这种类称为抽象类(abstract class)。因为这些类在继承的情况下是作为超类的,我们正式称其为抽象超类(abstract superclass),不能实例化抽象超类的对象。抽象超类的惟一目的是提供合适的超类,其他类可以继承其接口或实现这些类,可以从其中实例化对象的类称为具体类(concrete class)。我们也可以定义一个抽象超类 TwoDimensionalObject 和派生具体类 Cube、Sphere 和 Cylinder 等。抽象超类太过于一般化,因此无法定义真正的对象;在实例化对象之前需要更加具体的类。这就是具体类要完成的工作,具体类提供了具体的内容,以便能胜任实例化对象的任务。可以使用关键字 abstract 将类声明为抽象类。5、 新类和动态绑定可以使用动态方法绑定(也叫延迟绑定)的方法来添加新类。单元九:字符串(重点)1、 字符和字符串的基础字符是构造 Java 源程序块的基础。程序中可以包含字符常量,字符常量就是表示单引号内字符的一个整数值。正如我们前面讲到的,一个字符常量的值是该字符在标准字符集(Unicode)中的整数值。例如,z代表 z 的整数值,\n,代表换行符的整数值。由一系列字符组成的字符串可以作为一个单位进行处理。字符串可以包含字母、数字和各种特殊字符,如+、—、*、/、$等。Java 的字符串就是 String 类的对象,可以将 Java 中的字符串直接量或字符串常量(它们常称为匿名 String 对象)写成双引号中的字符序列。Java 将有相同内容的所有匿名 String 视为一个有多个引用的匿名 String 对象。一个 String 可在声明中赋给一个 String 引用。下列声明:String color =blue;将一个 String 引用 color 初始化为对匿名 String 对象blue的引用。2、 StringBuffer 类(重点)String 类提供了许多处理 String 的功能。然而,一旦创建了 String 对象以后,它的内容就不再 改 变 。 每 个 StringBuffer 都 能 够 存 储 由 其 性 能 规 定 的 字 符 数 目 , 如 果 超 出 了 一 个StringBuffer 的容量,则其容量便会自动扩展以容纳新增的字符。StringBuffer 类也用于实现运算符“+”和“+=”,它们用于 String 的连接。String 对象是常量字符串,而 StringBuffer 对象则是可修改字符串 Java 为优化的目的而区分常量字符串与可修改字符串。单元十 图形图形环境(graphic context)使 Java 能够在屏幕上绘图。Graphics 对象通过控制如何绘制信息来管理一个图形环境,Graphics 对象包含绘图、字体操作和颜色操作等方法。一个 Graphics 对象必须用于绘图。Graphics 类是一个 abstract 类即不能实例化 Graphics 对象。这样做的原因是为了 Java 的可移植性。因为在支持 Java的每个平台上绘图的执行过程都是不同的,因此不能有一个类来实现所有系统中的绘图功能。单元十一 GUI1、GUI图形用户界面(GUl)就是为应用程序提供一个图形化的界面。GUI 能够使一个应用程序具有5
与众不同的“外观”和“感觉”。用户和程序之间通过 GUI 进行交互。用于创建 GUI 组件的类包含在 Java.awt (abstract windowing toolkit)软件包中。可以通过下面的语句来引入java.awt 软件包中的类: ;其中星号(*)是一个通配符,表示要引入的多个类。2、FlowLayout 布局管理器FlowLayout 是最基本的布局管理器。默认情况下,FlowLayout 用于 applet 和面板,将各个组件添加的顺序依次排列(从左向右)。FlowLayout 类是从 0bject 类继承而来的,并提供了 LayoutManager 接口。LayoutManager 接口定义了一些方法,每个布局管理器都可以使用这些方法来安排容器中的组件。3、BorderLayout 布局管理器BorderLayout 布局管理器将组件按 5 个区域安排:北区;南区、东区、西区和中区(北区对应于容器的顶部)。 BorderLayout 是从 Object 类继承而来的,并提供了 LayoutManager 接口。4、GridLayout 布局管理器GridLayout 布局管理器将容器划分成网格,这样各个组件就可以按行列放置到每个网格中,每个组 件 的 大小都 是 一样的 。 GridLayout 类是 从 Object 类直 接 继承而 来 的 ,并提 供LayoutManager 接口。在向 GridLayout 添加组件时,其顺序是从网格的左上角开始,从左向右排列,直到排满一行,然后再从下一行开始从左向右排列,依次进行。单元十二 异常处理(重点)1、一些常见的异常实例包括:数组下标越界、算法溢出(即超出了数值的表达范围)、除数为零、无效参数及内存溢出等。2、异常处理应该用于下列情况:1)当方法由于其无法控制的原因而不能实现其功能时;2)处理来自某些程序组件的异常,在这些程序组件中不适合直接处理异常;3)在大型项目中,对于每个项目都以一致的方式进行错误处理。3、Java 异常处理的基础程序员将可能产生异常的代码包含在一个 try 程序块中。try 程序块后面紧跟着一个或多个catch 程序块。每个 catch 程序块都指定了它所能捕获的异常的类型,并包含一个相应的异常处理程序。在最后一个 catch 程序块的后面,可以提供一个可选的 finally 程序块,无论是否产生异常,该程序块都会执行。在本章后面我们将会看到,finally 程序块是执行资源释放操作以防止“资源泄漏”的理想位置。当抛出一个异常时,程序控制将离开 try 程序块,在各个 catch 程序块中按顺序查找适当的异常处理程序(后面将讨论哪一个是适当的处理程序)。如果抛出的异常的类型与某个 catch 程序块的参数类型相匹配,那么就执行该 catch 程序块中的代码。如果在一个即程序块中没有抛出任何异常,那么就跳过该程序块的异常处理程序,继续执行最后一个 catch 程序块之后的代码。如果在最后一个 catch 程序块之后有一个 finally 程序块,那么不论是否抛出异常,都要执行这个 finally 程序块。4、抛出异常执行 throw 语句意味着发生了异常,这通常称为抛出异常。throw 语句需要指定要抛出的对象。throw 的操作数可以是 Throwable 类的任何派生类。Throwable 类的两个直接子类是Exception 和 Error。Error 是指那些特别严重的系统问题,一般不应捕获,Exception 是由应捕获的问题引起的,可以在程序执行过程中进行处理,从而使程序更加强大。如果 throw的操作数是 Exception 类的一个对象,那么我们将其称为异常对象。5、 捕获异常异常处理程序包含在 catch 程序块中。每个 catch 程序块都以关键字 catch 开头,后跟一对圆6
括号,括号中为类名(指定要抛出的异常的类型);再后面是参数名,可以通过该参数引用处理程序捕获的对象;然后是一段程序代码,用于描述异常处理功能。捕获到一个异常后就执行 catch 程序块中的代码。6、 重抛出异常在用于捕获异常的 catch 处理程序中,很可能处理程序本身不能处理该异常,或是需要其他的 catch 处理程序来处理该异常。这时,可以在接收 Exception e 的处理程序中,通过下面的语句来重抛出该异常:throw e;该 throw 语句将把异常 e 重抛出到下一层的 try 即程序块中。7、 throw 子句8、 异常和继承9、 finally 程序块(重点)finally 程序块中通常都包含一些用于资源释放(相应的即程序块所需要的)的代码,这是避免资源泄漏的一种有效方法。finally 程序块是可选的,如果存在 finally 程序块,那么就将其放在 try 程序块的最后一个 catch 程序块的后面,无论 try 程序块或与它相应的 catch 程序块中是否抛出了异常,Java 都会确保执行 finally 程序块(如果存在)。10、 使用 printStackTraCe 和 getmessage 方法异常是从 Throwable 类派生的。Throwable 类提供了一个 printStackTrace 方法。用于打印方法调用堆栈的内容。在某个已被捕获的 Exception 对象中使用该方法,就可以将方法调用堆栈的内容打印出来。这通常有助于测试和调试。getMessage 方法用于返回保存在某个异常中的描述字符串,printStackTrace 方法用于向标准错误流(通常是命令行或控制台)输出一个错误信息,信息中包括该异常的类名称、保存在该异常中的描述字符串以及异常抛出时还没有执行完的一系列方法(即所有保留在当前的方法调用堆栈中的方法)。单元十三 多线程1、 多线程很多语言都不提供内置的多线程机制(比如 C 和 C++),因此必须调用操作系统的多线程原语操作。Java 和这些语言不同,它本身就包含多线程原语操作(包含在 java.1ang 软件包中的 Thread 类、ThreadGroup 类和 ThreadDeath 类中)。Java 的多线程是依赖于平台的。因此,一个带有多线程的 Java 应用程序在不同平台上的运行结果是不同的。在一个程序中,通过调用 start 方法(然后再调用 run 方法)可以启动一个新线程。当使用 start方法启动了新线程后,程序控制立即返回调用者,然后新线程与调用者就开始并发地执行。如果使用 start 方法启动一个已经启动的线程,则会引发 IllegalThreadStateException 异常。2、线程状态:一个线程的生命周期一个线程在生存期间总是处于某一种状态。假设一个线程在刚刚创建时称为“新生”状态,则该线程在调用 start 方法之前将一直处于“新生”状态;调用了 start 方法之后,该线程就进入“就绪”状态。当系统为线程分配了处理器时,具有最高优先级的就绪线程就将进入“运行”状态(即该线程开始运行)。当一个线程的 run 方法运行完毕,或调用了 stop 方法时,该线程就进入“停止”状态。一个停止的线程将被系统永久清除。3、线程优先级与线程调度有些 Java 平台支持时间分片方式,有些则不支持。如果不采用时间分片方式,那么具有相同优先级的每个线程都会一直执行到结束,才会把处理器让给其他的同级线程执行。如果采用时间分片方式,那么每个线程都只能在一个短暂的处理器时间分片内执行。当时间分7
片结束时,即使线程还没有执行完,也要将处理器让给下一个具有相同优先级的线程。Java 调度程序的功能是保证在任意时刻运行的线程都是最高优先级的,如果采用时间分片方式,那么调度程序就要确保具有相同优先级的每个线程,都能以轮转方式轮流运行时间分片(即这些线程都按时间分片方式运行)。4、线程同步(重点)Java 利用监控器的手段来完成同步操作。每个带有 synchronized 方法的对象都是一个监控器。监控器一次只允许一个线程对该对象执行 synchronized 方法。当调用某个对象的synchronized 方法时,就锁定该对象,这也就是所谓的“获得锁”。如果在一个对象中存在几个 synchronized 方法,那么一次只能有一个 synchronized 方法是激活的;所有其他要调用synchronized 方法的线程都必须等待。在一个 synchronized 方法执行结束后,就打开该对象上的锁,监控器会让调用 synchronized 方法的线程中优先级最高的那个线程继续执行。5、Runnable 接口(重点)Runnable 接口使我们可以将新类看成是一个 Runnable 对象(这就像使用了类继承后,可以将子类看成是其超类的一个对象)。如同从 Thread 类派生一样,控制线程的代码仍然放在run 方法中。6、 线程组单元十四 多媒体单元十五 文件和流1、 数据组织2、 文件和流Java 简单地把每个文件都视为一个顺序字节流(如图 15.2 所示)。每个文件或者结束于一个文件结束标志,或者根据系统维护或管理数据结构中所记录的具体字节数来终止。当打开一个文件时,就将创建一个对象,同时会有一个流和该对象关联。当我们开始运行一个Java 应 用 程 序 或 者 Java applet 时 , 就 自 动 创 建 了 3 个 流 对 象 System.in、System.out、System.err。与这些对象相关联的流提供了一个程序和某个文件或者设备之间的通信通道。3、 File 类File 类对于检索文件或目录的磁盘信息特别有用。File 类的对象并不能真正打开一个文件或提供任何文件操作功能,但可以用来判断一个文件已经存在。单元十六 网络1、TCP 协议Java 提供了流套接字和数据报套接字。一个进程使用流套接字来同其他进程建立一个连接。当连接建立后,数据流就可以在一个进程与另一个进程之间进行交换,因此将流套接字称为提供面向连接的服务。这种传输协议就是通常所说的传输控制协议(TCP,Transmission Control Protocol)。2、UDP——无连接协议(重点)单元十七 数据结构1、 链表链表是一些自引用对象的线性集合,这些对象称为节点,由于采用引用链将这些对象连接起来,因此称其为链表。可以通过链表第一个节点的引用而得到整个链表。通常,链表的最后一个节点的引用将设置为 null,以便标识这个链表结束。数据将动态地存储在一个链表中,只有在必要时才创建某个节点。节点中可以包含任何类型的数据,甚至是其他类的对象。2、 堆栈8
堆栈是一个压缩版本的链表仅能从一个堆栈的顶部添加或删除新的节点。正因为如此,我们称堆栈是一种后进先出(LIFO)的数据结构。堆栈的最后一个节点的链接成员将设置为null,用来表明堆栈的底部。操作一个堆栈的主要方法是 push(推入)和 pop(弹出),push 方法在堆栈的顶部增加—个新的节点,pop 方法将堆栈顶部的节点删除。3、 队列—个队列很像超级市场的收款队伍险列中先到的人先得到服务,新加入队列的顾客只能等在最后。队列中的节点仅能从首部删除,并且仅能在尾部添加,正因为如此,我们称队 列 为 先 进 先 出 (FIFO) 的 数 据 结 构 , 插 入 和 删 除 操 作 又 称 为 人 队 (enqueue) 和 出 队(dequeueL,队列在计算机系统中有许多应用。大多数计算机只有一个简单的处理器,因此在同一时刻只能由一个用户使用。其他用户的请求就要放在一个队列中,在队列最前面的请求将是下一个服务的对象。随着队列的前进,各个用户最终得到相应的服务。4、 树树是一种非线性的、二维的、拥有特殊属性的数据结构。树的节点包含两个或更多的指针二叉树是每个节点含有两个指针的树(全部指针或其中一个或两个都可以为 null)。根节点是树中的第一个节点,其中的每一个指针都指向一个子节点。左子节点是左子树的第一个节点。而右子节点是右子树的第一个节点。同一个节点的子节点之间称为兄弟节点。没有子节点的节点称为叶节点。二叉查找树是一种特殊二叉树。二叉查找树(不包含同值的节点)具有这样的特性:任何左子树中的值都小于它的父节点的值。而任何右子树的值都大于它的父节点的值。二叉查找树的遍历:使用递归的中序遍历、前序遍历和后序遍历。5、 动态内存请求运算符 new 用来请求内存。运算符 new 使用请求内存的对象的类型作为参数,而返回请求完成时这个类型对象的一个引用。例如,下列语句:Node nodeToAdd:new Node(10) ;为存储一个 Node 分配相应的空间,并将指向这块内存的引用赋给 nodeToAdd。如果请求不到内存,new 将抛出一个 OutOfMemoryException 异常,语句中的 10 是 Node 对象的值。单元十八 数据库单元十九 工具包单元二十 WEB 开发四、重点习题(一)单选题 程序的并发机制是。多线程多接口多平台 多态性 为 类的一个无形式参数无返回值的方法 !"# 书写方法头,使得使用类名 作为前缀就可以调用它,该方法头的形式为。$%#!"#&'(%#!"#)*(#!"# '$%#!"# 下列变量定义中+不合法的是。9