2023年6月20日发(作者:)
Java语⾔程序的设计第三版_习题答案第⼀章绪论1.简述Java技术体系的组成。Java技术体系主要由三部分组成:Java平台标准版Java SE,Java平台企业版Java EE,以及Java 平台微缩版Java ME。Java SE为Java桌⾯和⼯作组级应⽤的开发与运⾏提供了环境。它的实现主要包括Java SE Development Kit(JDK)和JavaSE Runtime Environment(JRE)。Java SE提供了编写与运⾏Java Applet与Application的编译器、开发⼯具、运⾏环境与Java API。Java EE 定义了基于组件的多层企业级应⽤的开发标准,⾯向企业级和⾼端服务器的Internet应⽤开发。它基于Java SE,包括Enterprise JavaBeans(EJB),Java Servlets API以及Java Server Pages(JSP)等技术,并为企业级应⽤的开发提供了各种服务和⼯具。Java ME是针对消费类电⼦设备如移动、电视置顶盒、汽车导航系统等的嵌⼊式计算的⼀组技术和规。2.Java的特征有哪些?简述这些特征的含义。Java语⾔的特征包括:简单(Simple)、⾯向对象(Object oriented)、分布式(Distributed)、解释型(Interpreted)、健壮(Robust)、安全(Secure)、体系结构中⽴(Architecture neutral)、可移植(Portable)、⾼性能(Highperformance)、多线程(Multithreaded)和动态(Dynamic)●简单性:Java语⾔语法和语义都⽐较单纯,容易学习和使⽤。另外,去掉C++中的指针,取消多重继承和运算符重载,存管理由程序员移向Java嵌的⾃动存回收机制等●⾯向对象:作为⼀种⾯向对象的编程语⾔,Java不仅最为“纯洁”,也对⾯向对象⽅法学的⽀持也最为全⾯。Java的对象有模块化性质和信息隐藏能⼒,满⾜⾯向对象的封装要求,同时⽀持继承和多态。●分布式:Java⽀持的分布式计算包括两种层次:⼀是数据分布,即应⽤系统所操作的数据可以分散存储在不同的⽹络节点上,可以通过Java的URL类访问。⼆是操作分布,即应⽤系统的计算可通过嵌在WWW页⾯中的Applet(⼩应⽤程序),分布到不同的⽹络节点完成。●半编译,半解释:采⽤编译器对程序进⾏编译,但编译得到的是⼀种中性的字节码,并不是本机代码,⽽字节码的执⾏采取解释执⾏⽅式。该特征,提⾼了Java 的可移植性,并使得Java语⾔兼具编译执⾏的效率优势和解释执⾏的灵活性。●健壮性:Java提供⾃动垃圾收集来进⾏存管理,防⽌程序员在管理存时容易产⽣的错误。通过集成的⾯向对象的例外处理机制,帮助程序员正确地进⾏选择以防⽌系统的崩溃。另外,Java是⼀种强类型语⾔,程序编译时要经过严格的类型检查,防⽌程序运⾏时出现类型不匹配等问题。●安全性:Java在语⾔和运⾏环境中引⼊了多级安全措施,其采⽤的主要安全机制有:存分配及布局由Java 运⾏系统规定。运⾏系统执⾏基于数字签名技术的代码认证、字节码验证与代码访问权限控制的安全控制模型。●体系结构中⽴:Java为了做到结构中⽴,除了上⾯提到的编译⽣成机器⽆关的字节码外,还制定了完整统⼀的语⾔⽂本。为了使Java 的应⽤程序能不依赖于底层具体的系统,Java 语⾔环境还提供了⼀个⽤于访问底层操作系统功能的可扩展类库,当程序使⽤这些库时,可以确保它能运⾏在⽀持Java 的各种平台上。●可移植性:Java的最⼤特点是“⼀次编程,处处运⾏”。任何机器只要配备了Java解释器,便可运⾏Java程序。这种可移植性源于两⽅⾯:⼀是Java的半编译、半解释特征;另⼀⽅⾯是Java体系结构中⽴,采⽤标准的独⽴于硬件平台的数据类型。●⾼性能:Java语⾔的字节码与机器码⼗分接近,使得字节码到机器码的转换⼗分快捷。另外,Java还提供了即时编译技术,提⾼了Java应⽤的运⾏速度。●多线程:Java的特点是在语⾔级嵌⼊了多线程机制,⽀持程序的并发处理功能。从程序的⾓度看,⼀个线程就是应⽤程序中的⼀个执⾏流。Java 将临界区保护规则等集成到语⾔中实现线程同步,使这些规则的使⽤更加⽅便有效。●动态特性:Java程序的基本组成单元是类,⽽Java的类⼜是运⾏时动态装载的,这使将Java可以动态地维护应⽤程序及其⽀持类之间的⼀致性。3.Java语⾔的语法机制与C/C++有何异同?Java的基本语法机制,例如:数据类型、表达式、程序流控制、结构化异常处理等,都与C++相同。明显区别于C++的语法机制,包括类(class)、接⼝(Interface)、程序包(package)、多线程以及取消指针。4.Java运⾏系统由哪些部分组成?Java程序的运⾏过程是怎样的?Java运⾏系统⼀般包括以下⼏部分:类装配器、字节码验证器、解释器、代码⽣成器和运⾏⽀持库。Java运⾏系统运⾏的是字节码即.class⽂件。执⾏字节码的过程可分为三步:(1)代码的装⼊由类装配器装⼊程序运⾏时需要的所有代码,其中包括程序代码中调⽤到的所有类。当装⼊了运⾏程序需要的所有类后,运⾏系统便可以确定整个可执⾏程序的存布局。(2)代码的验证由字节码检验器进⾏安全检查,以确保代码不违反Java的安全性规则,同时字节码验证器还可发现操作数栈溢出、⾮法数据类型转化等多种错误。(3)代码的执⾏Java字节码的运⾏可以有两种⽅式:即时编译(Just-In-Time)⽅式和解释执⾏⽅式。5.什么是JVM?Java虚拟机是⼀个想象中的,能运⾏Java字节码的操作平台。⽽JVM规提供了这个平台的严格的规说明,包括指令系统,字节码格式等。JVM进⼀步可⽤软件在不同的计算机系统上实现或⽤硬件实现。JVM的实现包括字节码验证、解释器、存垃圾回收等,是上述Java 运⾏系统的核⼼,Java运⾏系统是各供应商对JVM的具体实现。7.编写⼀个Java程序,在屏幕上输出“欢迎学习Java语⾔!”的字符串。public class Welcome{public static void main (String args[]){n("欢迎学习Java语⾔!");}}第⼆章⾯向对象程序设计基本概念1.什么是对象?什么是类?什么是实体?它们之间的相互关系是怎样的?试举例说明。在⾯向对象⽅法中,对象是现实世界实体或概念在计算机世界中的抽象表⽰,是具有唯⼀对象名、固定对外接⼝的⼀组变量/属性和⽅法的集合,是⽤来模拟组成或影响现实世界问题的⼀个或⼀组因素。类定义了对象类型,包含同⼀类型的对象具有共同的特征与⾏为。使⽤class定义的类在程序中称为⼀种抽象数据类型,它是⾯向对象程序设计语⾔的基本概念。⼀个类在定义后,我们就可以象使⽤其它数据类型⼀样,声明该类的变量并创建该变量所指向的对象,然后通过该变量调⽤对象的⽅法实现对对象的操作。实体表⽰现实世界中,客观存在并可区分的事物或概念。在⾯向对象的问题求解⽅法中,⾸先对现实世界的问题域进⾏语义抽象,从各类对象中抽象出对象类型,并得到对象类型之间的关联,形成问题的概念模型。接下来,进⾏概念模型到机器(程序)模型的转换得到机器世界的模型。机器模型是由计算机能够理解和处理的类构成的。将类实例化就得到了现实世界实体的⾯向对象的映射——对象,在程序中对对象进⾏操作,就可以模拟现实世界中的实体及实体之间相互作⽤,解决由这些实体构成的现实世界中的问题。举例来说,我们很多⼈都有⾃⾏车,你的⾃⾏车就是“⾃⾏车”这类交通⼯具中的⼀个实例,即现实世界的⼀个实体。在机器世界中即程序中的⾃⾏车类包含了⾃⾏车都有相同的状态,例如两个轮⼦、脚踏板速度等,以及共同的⾏为,如刹车等,将⾃⾏车类实例化就得到了现实世界的⾃⾏车实体的映射——⾃⾏车对象,在程序中对这个对象进⾏操作,就可以模拟现实世界中的⾃⾏车与其他实体之间相互作⽤。2.什么是对象的状态与⾏为?设有对象“学⽣”,试给出这个对象的状态和⾏为。现实世界的对象具有两个特征:状态与⾏为。⾯向对象程序设计语⾔中的对象是以现实世界的对象为模型构造的,也具有状态与⾏为,其中状态保存在⼀组变量中,⽽对象的⾏为通过⽅法实现。“学⽣”的状态包括:学号、、年龄、所属院系、专业⽅向等;“学⽣”的⾏为包括:注册、选课、基本信息维护等。3.什么是封装与数据隐藏?使⽤对象的对外接⼝(⽅法)将对象的变量与⽅法实现保护起来,外界只能通过对象的接⼝访问对象的服务,⽽对对象其它成员都⽆法访问,就称为封装。因此,对象中的数据封装同时也实现了对象的数据隐藏。数据隐藏是通过对象成员的访问控制实现的。在Java语⾔中提供了四种不同层次的访问控制,即public,protected,default和private,从⽽实现了对象四种不同程度的数据隐藏。4.什么是上溯造型?什么是晚联编?多态的含义是什么?上溯造型的含义是⼦类沿着类继承体系向上,将其类型塑造为⽗类类型,使得⼦类对象能够当作⽗类对象处理。程序中调⽤对象的⽅法时,所调⽤的代码直到运⾏时刻才确定。因此,在程序编译时,编译器可以保证该⽅法存在并且执⾏参数与返回结果的类型检查,但却不知道要执⾏的准确代码。在运⾏时刻,Java运⾏系统根据对象变量当时所指向对象的实际类型,调⽤该对象的相应⽅法。这种技术称为晚联编。⾯向对象的多态特征,简⽽⾔之就是“对外⼀个接⼝,部多种实现”。⾯向对象程序设计语⾔⽀持两种形式的多态:运⾏时多态和编译时多态。编译时多态主要是通过重载(Overloading)技术实现的,即在⼀个类中相同的⽅法名可⽤来定义多种不同的⽅法。运⾏时多态是在⾯向对象的继承性的基础上建⽴的,是运⾏时动态产⽣的多态性,是⾯向对象的重要特性之⼀。5.怎样理解⾯向对象程序设计⽅法的涵?⾯向对象程序设计⽅法的涵,可以由对象、数据抽象、封装、继承和多态等核⼼概念和特征表达:程序中所有东西都是对象;程序是⼀系列对象的组合;每个对象都有⾃⼰的存储空间,可以容纳其它对象;每个对象都有⼀种类型,即都归属于⼀个类,类最主要的特征是对外接⼝;同⼀类型的所有对象都能够接收相同的消息,⼦类与⽗类具有“同⼀类型”,这就是⾯向对象程序语⾔中的多态性。6.⾯向对象程序设计有哪些优点?⾯向对象程序设计⽅法的主要优势是具有更好的可重⽤性、可扩展性、可管理与维护性。在⾯向对象程序设计中,可重⽤的代码是类和对象。数据抽象、封装、继承、多态等特征都围绕和体现了代码重⽤的思想。⾯向对象的封装、继承和多态使得程序可以对⼀个类的部变量和⽅法进⾏修改或增加新的变量和⽅法,可以按照需要派⽣新的⼦类,但仍可以保证调⽤这些类接⼝的程序不做改动,从⽽使程序具有很强的可扩展性与易维护性。⽽⾯向对象的数据抽象与封装,使程序具有模块化特性,这简化了程序中代码之间的关联,使程序更易于管理和控制。第三章 Java语⾔基础1.下列标识符哪些是合法的?$88,#67,num,applet,Applet,7#T,b++,--b合法的标识符:$88,num,applet,Applet2.Java有哪些基本数据类型?什么是复合数据类型?对于这两种类型的变量,系统的处理有什么不同?Java基本数据类型包括:boolean,char,byte,short,int,long,double和float 复合数据类型:⼀般将⽤户定义的新类型称为复合数据类型。Java以类和接⼝的形式定义新类型。因此在Java中类和接⼝是两种⽤户定义的复合数据类型。对于这两种类型的变量,系统的处理⽅式:基本数据类型的变量包含了单个值,这个值的长度和格式符合变量所属数据类型的要求,基本类型变量声明时,系统直接给该变量分配空间,因此程序中可以直接操作。引⽤型变量的值是指向存空间的引⽤(地址),声明时只是给该变量分配引⽤空间,数据空间未分配。引⽤型变量在声明后必须通过实例化开辟数据空间,才能对变量所指向的对象进⾏访问。3.设变量i和j的定义如下,试分别计算下列表达式的值。inti=1;double d=1.0(1)35/4; (2)46%9+4*4-2; (3)45+43%5*(23*3%2); (4)45+45*50%i--;(5)45+45*50%(--i); (6)1.5*3+(++d); (7)1.5*3+d++;(8)i+=3/i+3;(1)8;(2)15;(3)48;(4)45;(5)除0异常;(6)6.5;(7)5.5;(8)74.计算下列逻辑运算表达式的值:(1) (true) && (3 > 4)(2) !(x> 0) && (x > 0)(3) (x > 0) || (x < 0)(4) (x != 0) || (x == 0)(5) (x >= 0) || (x < 0)(6) (x != 1) == !(x == 1)(1)false(2)false(3)如果x=0,为false; 如果x!=0, 为true(4)true(5)true(6)true5.Java中有哪些类型程序流控制语句?Java语⾔提供了4类程序流控制语句:●循环语句,包括while语句、do while 语句和for语句。●分⽀语句,包括if语句和switch语句。●跳转语句,包括break语句, continue语句, label:语句, return语句.●异常处理语句,包括try-catch-finally语句和throw语句。6.switch语句与if语句可以相互转换吗?使⽤switch语句的优点是什么?switch语句可以转换为if语句,但if语句不⼀定能转换为switch语句。因为switch 以⼀个整型表达式的值作为判定条件,⽽if可以判断各种条件。使⽤switch结构更简单,可读性强,⽽且程序的执⾏效率也得到提⾼。7.试写出下列循环的运⾏结果。Int i = 1;while(i<10){if ((i++)%2 ==0){n(i);}}35798.While循环和do循环有什么区别?while语句运⾏时,先计算逻辑表达式的值,当值为“true”时,执⾏循环体语句。do while 语句⾸先执⾏循环体中的语句,然后再求表达式的值,如果为“true”则继续循环;如果为“false”, 则终⽌循环。因此, dowhile循环⾄少要执⾏⼀次循环体。9.循环跳转语句break的作⽤是什么?试给出下列程序的运⾏结果。inti = 1000;while(true){if(i<10){break;}i = i-10;}n("The value of i is "+i);break语句⽤来从switch语句、循环语句中跳出。它结束了switch语句的执⾏,并把控制流转移到紧跟在switch之后的语句。我们还可以使⽤不带标签的break语句终⽌循环。带标签的break语句结束由标签指定的外层语句的执⾏。上述程序的运⾏结果是:The value of i is 010.循环跳转语句continue的作⽤是什么?试给出下列程序的运⾏结果。inti = 1000;while(true){if(i<10){continue;}i = i-10;}在for、while和do while循环中,continue语句跳过当前循环的其余语句,执⾏下⼀次循环。不带标签的continue语句跳过最层的循环,并开始执⾏最层循环的下⼀次循环。上述程序当i的值为0以后,将进⼊死循环。13.下列数组声明哪些是合法的?(1)inti = new int(30);(2)double d[] = new double[30];(3)Integer[] r = new Integer(1..30);(4)inti[] = (3, 4, 3, 2);(5)float f[] = {2.3, 4.5, 5.6};(6)char[] c = new char();(7)Integer[][] r = new Integer[2];合法声明语句:(2)14.数组变量是基本类型变量还是引⽤型变量?数组的存是在什么时候分配的?数组变量是引⽤型变量。数组的声明并不创建实例数组的数据空间,⽽是给该数组变量分配了⼀个可⽤来引⽤该数组的引⽤空间。数组元素所需的存空间是通过new运算符或通过数组初始化分配的。第四章 Java⾯向对象特性1.试说明JAVA语⾔是如何⽀持多重继承的。Java中是通过接⼝实现多重继承的。接⼝(interface)机制,允许⼀个类实现多个接⼝。这样既避免了多重继承的复杂性,⼜达到了多继承的效果。2.类的构造⽅法和成员⽅法之间有什么区别?类的构造⽅法是⾮常特殊的⽅法,与成员⽅法的区别包括:(1)构造⽅法的名称必须与类名相同。(2)构造⽅法不能有返回值。(3)⽤户不能直接调⽤构造⽅法,必须通过关键字new⾃动调⽤它。中⽅法调⽤的参数传递⽅式是什么?Java中⽅法调⽤的参数传递⽅式是传值,即⽅法调⽤不会改变调⽤程序中作为⽅法参数的变量的值。当⽅法的参数类型是对象或数组等引⽤类型时,在⽅法中可能改变引⽤型参数所指向的对象的容,但是对象的引⽤不会改变。关键字的作⽤是什么?this是Java使⽤的⼀个有特定意义的引⽤,它指向当前对象⾃⾝。7.⼀个类中的⽅法,要使同⼀个包中的类可以访问⽽其它类不能访问,应该使⽤怎样的访问控制?对于该⽅法不加任何访问权限限定,即使⽤缺省的访问权限——default或package。8.什么是⽅法重载?⽅法重载的规则是什么?⽅法的重载是在⼀个类的定义中,多个⽅法使⽤相同的⽅法名,这些⽅法功能类似但参数不同。Java中规定重载的⽅法必须遵循下列原则:(1)⽅法的参数表必须不同,包括参数的类型或个数,以此区分不同⽅法体;(2)⽅法的返回类型、修饰符可以相同也可不同。9.什么是⽅法重写?⽅法重写的规则是什么?重写(Overriding)是指⼦类重新实现从⽗类继承⽽来的成员⽅法。Java中⽅法重写要遵守以下规则:(1)⼦类中重写⽅法的返回值类型必须与⽗类中被重写⽅法的返回值类型相同。(2)⼦类中重写⽅法的访问权限不能缩⼩。(3)⼦类中重写⽅法不能抛出新的异常。10.试说明JAVA语⾔中多态的含义及实现机制。多态的含义是,对外⼀个接⼝,部多种实现。Java中的多态包括运⾏时多态和编译时多态。编译时多态主要是通过重载(Overloading)技术实现的,运⾏时多态是通过上溯造型和动态联编技术实现的。上溯造型使⼀个对象既可以当作它⾃⼰的类型也可以作为其⽗类的类型对待,这意味着⼦类对象可作为⽗类的对象使⽤;⽗类的对象变量可以指向⼦类对象。这样通过⼀个⽗类变量发出的⽅法调⽤,可能执⾏的是该⽅法在⽗类中的实现,也可能是在某个⼦类中的实现,这只能在运⾏时刻根据该变量指向的具体对象类型确定,这就是运⾏时多态。11.给出下列程序的运⾏结果:class Meal {Meal() { n("Meal()"); }}class Bread {Bread() { n("Bread()"); }}class Cheese {Cheese() { n("Cheese()"); }}class Lettuce {Lettuce() { n("Lettuce()"); }}class Lunch extends Meal {Lunch() { n("Lunch()"); }}classPortableLunch extends Lunch {PortableLunch() { n("PortableLunch()");}}public class Sandwich extends PortableLunch {private Bread b = new Bread();private Cheese c = new Cheese();private Lettuce l = new Lettuce();publicSandwich() {n("Sandwich()");}public static void main(String[] args) {new Sandwich();}}程序运⾏结果:Meal()Lunch()PortableLunch()Bread()Cheese()Lettuce()Sandwich()第五章 Java⾼级特征1.举例说明类⽅法与实例⽅法以及类变量与实例变量之间的区别。类⽅法要通过类名访问,实例⽅法需要通过实例对象访问。例如,/doc/ ng的System 类中的exit()⽅法。类变量只在系统加载其所在类时分配空间并初始化,并且在创建该类的实例时将不再分配空间,所有的实例将共享类的静态变量。类变量在类外直接⽤类名调⽤,⽽不象实例变量那样需要通过实例对象才能访问。例如,/doc/ ng的System中的out变量,该变量的定义为:static PrintStreamout,所以当我们需要向监控台输出信息时,可以在程序中直接调⽤n(“…….”)。2.什么是接⼝?接⼝的意义是什么?接⼝(interface)从定义形式上类似于抽象类。接⼝中声明了⽅法,但不定义⽅法体,因此接⼝只是定义了⼀组对外的公共接⼝。与类相⽐,接⼝只规定了⼀个类的基本形式,不涉及任何实现细节。实现⼀个接⼝的类将具有接⼝规定的⾏为。Java中规定⼀个类只能继承⼀个⽗类,但可以实现多个接⼝,因此利⽤接⼝实现了多重继承⽽没有强⾏形成类的继承关系。避免产⽣代码冲突,保证了Java的简单性与代码的安全可靠,同时对⾯向对象⽅法论的⽀持更纯洁。3.什么是包?如何定义包?包是Java中类和接⼝的⼀种组织、管理和使⽤的单位,是相关类与接⼝的⼀个集合,使类和接⼝易于查找和使⽤,并提供了独⽴的类命名空间和访问保护。使⽤package语句指定⼀个源⽂件中的类属于⼀个特定的包。Package语句的格式如下:package pkg1[.pkg2[.pkg3…]]。如果源⽂件中没有package语句,则指定为⽆名包。4.什么是抽象类?抽象类与接⼝有何区别?抽象类是包含⼀个或多个抽象⽅法的类,只有声明⽽没有⽅法体的⽅法称为抽象⽅法。抽象类也可有构造⽅法、普通的成员变量或⽅法,也可以派⽣抽象类的⼦类。但抽象类在使⽤上有特殊的限制,即不能创建抽象类的实例。抽象类与接⼝之间的区别:(1)接⼝中的所有⽅法都是抽象的,⽽抽象类可以定义带有⽅法体的不同⽅法。(2)⼀个类可以实现多个接⼝,⽽只能继承⼀个抽象⽗类。(3)接⼝与实现它的类不构成类的继承体系,即接⼝不是类体系的⼀部分。因此,不相关的类也可以实现相同的接⼝。⽽抽象类是属于⼀个类的继承体系,并且⼀般位于类体系的顶层。5.下列接⼝的定义,哪个是正确的?(1)interface Printable{void print(){ };}(2)abstract interface Printable{void print();}(3)abstract interface Printable extends Interface1,Interface2{void print(){ };}(4)interface Printable{void print();}正确的接⼝定义:(4)第六章异常处理1.什么是异常?Java异常处理有哪些⽅法?在程序运⾏时打断正常程序流程的任何不正常的情况称为错误或异常。例如,试图打开的⽂件不存在、⽹络连接中断、操作符越界和要加载的类找不到等。异常处理是指程序获得异常并处理,然后继续程序的执⾏。异常处理具体有两种⽅式:捕获并处理异常;将⽅法中产⽣的异常抛出。2.Java中的异常处理主要处理哪些类型的异常?Java的异常处理机制主要针对RuntimeException类型和除Error类型以外的其他Exception类型。RuntimeException意味着程序设计或实现问题,如:数组使⽤越界;算术运算异常(如除0运算);空指针异常即访问没有初始化的空指针等。正确设计与实现的程序不应产⽣这些异常。对于这类异常,处理的策略是纠正错误。其它的异常Exception类,通常是由环境因素引起的,例如:⽂件不存在,⽆效URL等。这类异常经常是由⽤户的误操作引起的,可以在异常处理中处理,例如提⽰⽤户进⾏正确操作等3.⽤户程序如何⾃定义异常?⾸先定义异常类,⽤户⾃定义的异常类定义为Exception类的⼦类。这样的异常类可包含普通类的容。定义了⾃定义异常类后,程序中的⽅法就可以在恰当的时候利⽤throw语句将该种异常抛出,注意要在⽅法的声明中声明抛出该类型的异常。之后,Java程序在调⽤声明抛出⾃定义异常的⽅法时,要进⾏异常处理。具体可以采⽤上⾯介绍的两种⽅式:利⽤try-catch-finally语句捕获并处理;声明抛出该类型的异常。4.系统异常如何抛出?⽤户⾃定义异常如何抛出?如果执⾏try块⾥的语句时出现系统定义异常,JVM会⾃动⽣成⼀个相应的异常对象,并定位相应的异常处理语句块。⽤户⾃定义异常类后,异常是在⽤户⽅法的声明中使⽤throws⼦句进⾏声明的,执⾏throw语句进⾏异常对象抛出。5.设下列try-catch语句块中的第⼆个语句s2将引起⼀个异常,试回答下列问题:try{s1;s2;s3;}catch(ExceptionType e1){ }catch(ExceptionTpye e2){ }s4;(1)s3会执⾏吗?产⽣异常后,s3不会执⾏,系统转型catch 语句匹配进⾏错误处理的语句。(2)如果异常未被捕获,s4会被执⾏吗?如果异常未被捕获,则运⾏流程会转型上⼀层调⽤程序,s4不会被执⾏。(3)如果catch⼦句捕获了异常,s4会执⾏吗?如果catch⼦句捕获了异常,s4会执⾏。第七章输⼊/输出1.什么是节点流?什么是过滤流或处理流?节点流:以特定源如磁盘⽂件、存某区域或线程之间的管道为端点构造的输⼊/输出流,它是⼀种最基本的流。过滤流:以其它已经存在的流为端点构造的输⼊/输出流,称为过滤流或处理流,它要对与其相连的另⼀个流进⾏某种转换。的输⼊/输出流可以实现哪些类型的输⼊/输出?存I/O;管道I/O;⽂件I/O;对象I/O;数据转换,即按基本数据类型读、写数据;缓存I/O,即对数据进⾏缓存,以减少I/O的次数;流数据计数;流预读,即通过缓存机制进⾏预读;字节与字符转换等。3.字节流与字符流之间有什么区别?字节流:流中的数据以8位字节为单位进⾏读写,以InputStream与OutputStream为基础类。字符流:流中的数据以16位字符为单位进⾏读写,以Reader与Writer为基础类。字节流与字符流的主要差别是处理的数据类型不同,其它基本相类似。4.管道流的主要⽤途是什么?如何创建管道流?管道流可以实现线程间数据的直接传输。线程之间通过管道传输数据与共享缓冲区⽅法相⽐,不需要进⾏线程同步,节省存并提⾼了程序的运⾏效率。管道流的创建是将管道输出流和管道输⼊流进⾏挂接。基于管道类的构造⽅法,可以采取下列两种⽅式创建管道流:PipedInputStream pin= new PipedInputStream( );PipedOutputStream pout = new PipedOutputStream(pin);或PipedInputStream pin= new PipedInputStream( );PipedOutputStream pout = new PipedOutputStream();t(out);或t(in);管道流创建后,需要把它的输出流连接到⼀个线程的输出流,并且把它的输⼊流连接到另⼀个线程的输⼊流,才能利⽤该管道流实现这两个线程之间的数据交流。AccessFile类实现了哪两个接⼝?具有哪些输⼊输出功能?RandomAccessFile类实现了DataInput和DataOutput接⼝。RandomAccessFile类提供的⽂件操作主要分为三类:对⽂件指针的操作、读操作与写操作。RandomAccessFile实现的是随机读写,即可以在⽂件的任意位置进⾏数据的读写。RandomAccessFile类可可以按数据类型读取数据,读⽅法主要包括:readBoolean(),readChar(),readInt(),readLong(),readFloat(),readDouble(),readLine(),readUTF()等。这些⽅法的功能与DataInputStream类中的同名⽅法相同。其中,readLine()从当前位置开始,到第⼀个‘n’为⽌,读取⼀⾏⽂本,它将返回⼀个String对象。RandomAccessFile 类具有类型转换功能的写操作⽅法。RandomAccessFile类包含的写⽅法主要包括:WriteBoolean(),WriteChar(),WriteUTF(),WriteInt(),WriteLong(),WriteFloat(),WriteDouble()等。8.什么是对象串⾏化?将Java程序中的对象保存在外存中,称为对象永久化。对象永久化的关键是将它的状态以⼀种串⾏格式表⽰出来,以便以后读该对象时能够把它重构出来。因此对Java对象的读、写的过程被称为对象串⾏化(Object Serialization)。Java 定义了ObjectInputStream类和ObjectOutputStream类实现对象的串⾏化。9.利⽤ObjectInputStream/ObjectOutputStream可以存取哪种类型的对象?写⼊对象的⽅法是什么?读取对象的⽅法是什么?如果⼀个对象它所对应的类实现了Serializable接⼝,则该对象是可以利⽤ObjectInputStream / ObjectOutputStream 进⾏存取,即ObjectInputStream /ObjectOutputStream 可以存取Serializable类型的对象。写⼊对象的⽅法,是ObjectOutputStream类的writeObject()⽅法;读取对象的⽅法是ObjectInputStream类的readObject()⽅法。第⼋章基于Swing的图形化⽤户界⾯与AWT最⼤的区别是什么?AWT定义各种组件(Components)类提供平台独⽴的API,然后利⽤特定于平台的各种类的实现(称为对等组件,peers)提供具有特定平台风格的L&F。Swing与AWT最⼤的区别是,Swing提供了丰富的组件,并且提供了独⽴于运⾏平台的GUI构造框架。Swing是纯Java实现的轻量级(Light-weight)组件,没有本地代码,不依赖操作系统的⽀持。Swing在不同的平台上都能够具有⼀致的显⽰风格,并且能够提供本地窗⼝系统不⽀持的其它特性。组件有哪些特性?Swing组件的特性包括:(1)组件的多样化(2)采⽤分离模型结构(Separable Model Architecture),即采⽤组件及与组件相关的数据模型(或简称模型)这样的分离结构。(3)可设置的组件外观感觉(Look and Feel,L&F)(4)⽀持⾼级访问⽅式,所有Swing组件都实现了Accessible接⼝,提供对⾮常规⾼级访问⽅式的⽀持。(5)Swing组件提供热键,⽀持键盘代替⿏标的操作(6)对Swing组件可以设置⼀个和多个边框。(7)可以在组件上使⽤图标中,能够向JFrame中直接添加组件吗?如何向JFrame中添加组件构造GUI?Swing组件不能直接添加到顶层容器中,必须添加到⼀个与顶层容器相关联的容⾯板(Content Pane)上。在JDK1.5后的版本中,为了⽅便使⽤,JFrame的add()⽅法被重写,可以把通过该⽅法添加的组件⾃动转交给容⾯板。向JFrame中添加组件可采⽤两种⽅式:(1)⽤getContentPane()⽅法获得JFrame的容⾯板,再使⽤add()⽅法向其中加⼊组件。(2)建⽴⼀个JPanel或JDesktopPane等中间容器,把组件添加到中间容器中,再⽤setContentPane()⽅法把该容器设置为JFrame的容⾯板,另外,在JDK1.5后的版本中,可以象操作AWT中的容器⼀样,直接对容器添加组件。4.AWT中⽀持⼏种布局管理器?它们各⾃的风格是怎样的?AWT⽀持的布局管理器包括:●FlowLayout——流式布局●BorderLayout——边界布局●GridLayout——⽹格布局●CardLayout——卡⽚布局●GridBagLayout——⽹格包布局FlowLayout容器的组件采⽤从左到右,从上到下逐⾏摆放。BorderLayout布局管理器将容器分为5个区:East、West、South、North、Center,可以将组件分别按东、西、南、北、中5个⽅位摆放。GridLayout布局管理器把容器分成n⾏m列同样⼤⼩的⽹格单元。每个⽹格单元可容纳⼀个组件,并且此组件将充满⽹格单元。组件按照从左⾄右,从上⾄下的顺序填充。CardLayout可以使两个或更多的组件(⼀般是Panel)共享同⼀显⽰空间。CardLayout 把这些组件像⼀系列卡⽚⼀样叠放,⼀个时刻只有最上⾯的是可见的。GridBagLayout的组件显⽰区域是⼀组动态的、矩形的⽹格单元,每个组件占有⼀个或多个⽹格单元。5.设计GUI的⼀般步骤是什么?基于Swing的应⽤程序GUI,⼀般包括如下部分:(1)引⼊Swing 包或AWT及其它程序包(2)选择GUI的外观风格L&F(3)创建并设置窗⼝容器,即创建GUI的顶层容器并进⾏布局管理器等设置(4)创建与添加Swing或AWT组件(5)显⽰顶层容器,将整个GUI显⽰出来6.试述委托⽅式(监听器⽅式)的事件处理机制。委托⽅式(监听器⽅式)的事件处理机制中,⾸先要定义监听器类。在Java中每类事件都定义了⼀个相应的监听器接⼝,该接⼝中定义了接收事件的⽅法。实现该接⼝的类,其对象可作为监听器注册。然后需要将监听器类的对象注册为组件的监听器。在GUI中,需要响应⽤户操作的相关组件要注册⼀个或多个相应事件的监听器,该监听器中包含了能接收和处理事件的事件处理⽅法。在该类事件产⽣时,事件对象只向已注册的监听器报告,并运⾏相应的事件处理⽅法。7.如何采⽤部类实现事件处理?事件适配器给监听器类的定义带来了⽅便,但同时也限制了监听器类对其它类的继承。为了既使⽤Adaptor类,⼜避免多重继承的限制,例如,假设我们要编写⼀个Applet程序,主类名称为MyApplet,MyApplet中要包含⿏标事件的处理⽅法。因为MyApplet类是Applet 类的⼦类,所以该类将不能再继承MouseAdapter。解决这个问题的有效⽅法是采⽤部类,,由部类继承相应Adaptor类。该类的对象可以作为执⾏事件处理的监听器注册。例如:public class MyClass extends Applet {...seListener(new MyAdapter());...classMyAdapter extends MouseAdapter {public void mouseClicked(MouseEvent e) {...//Event handler implementation }}}8.Window组件可以使⽤哪些类型的监听器?Window组件可以使⽤WindowListener,对窗⼝的打开、关闭、激活、去活等操作进⾏响应;WindowFocusListener,对窗⼝获得聚焦和失去聚焦的操作进⾏响应;WindowstateListener,当窗⼝的状态发⽣变化,如对最⼩化和最⼤化等操作进⾏响应。9.如何设置组件的颜⾊和字体?Component类是⼀个抽象类,是AWT中所有组件的⽗类,也是Swing中JComponent类⽗类,JComponent类是Swing中除了顶层容器外其他组件的⽗类。Component类为其⼦类提供了很多功能,包括提供⽅法setBackGround(),setForeGround(),setFont()等⽅法设置组件字体、颜⾊等。所以可以调⽤具体组件的上述⽅法进⾏颜⾊和字体的设置。第九章 Applet程序设计的运⾏过程是怎样的?Applet的运⾏包括如下四个步骤:(1)浏览器加载指定URL中的HTML⽂件;(2)浏览器解析HTML⽂件;(3)浏览器加载HTML⽂件中指定的Applet类;(4)浏览器中的Java运⾏环境运⾏该Applet。⽣命周期相关的⽅法有哪些?这些⽅法是如何被调⽤的?Applet⽣命周期相关⽅法包括init(),start(), stop(),destroy()等4种⽅法。init()是在装载Applet时被调⽤,使Applet执⾏⼀些基本初始化。start()是在init()⽅法之后被调⽤,使Applet成为激活状态。stop()是在浏览器离开含有Applet的⽹页时被调⽤,可⽤该⽅法暂时停⽌线程。Destroy()是在浏览器完全关闭之前被调⽤,彻底终⽌Applet,从存卸载并释放该Applet的所有资源。显⽰或刷新过程中要调⽤哪些⽅法?Applet在初次显⽰,或运⾏过程中浏览器窗⼝⼤⼩发⽣变化⽽引起Applet的显⽰发⽣变化时,将调⽤Applet的paint()⽅法进⾏Applet绘制。当Applet代码需要更新显⽰容时,则从程序中调⽤repaint()⽅法,则AWT线程在接受到该⽅法的调⽤后,将调⽤Applet的update()⽅法,⽽update()⽅法再调⽤组件的paint()⽅法实现显⽰的更新。t中是否可以添加AWT组件?为什么?JApplet中⼀般都使⽤Swing组件,⽽不使⽤AWT组件。因为应避免Swing组件与AWT 组件混合使⽤:在Swing GUI中应该全部使⽤轻量级组件,避免使⽤被称为重量级组件的AWT组件。第⼗章线程1.试述进程与线程之间的关系。进程是核级的实体。包含虚存映象、⽂件指⽰符,⽤户ID等。这些结构都在核空间中,⽤户程序只有通过系统调⽤才能访问与改变。线程是⽤户级的实体,是程序中的单个执⾏流,线程结构驻留在⽤户空间中,能够被普通的⽤户级函数组成的线程库直接访问。寄存器(栈指针,程序计数器)是线程专有的成分。⼀个进程可以通过运⾏多个线程来并发地执⾏多项任务,进程中的所有线程共享该进程的状态。中线程的模型由⼏部分构成?在Java中线程的模型就是⼀个CPU、程序代码和数据的封装体,即⼀个虚拟的CPU,该CPU 执⾏的代码,以及代码所操作的数据。3.创建线程的两种⽅式是什么?Java中线程体由Thread类的 run( ) ⽅法定义,有两种⽅式进⾏run( )⽅法的定义:(1)实现 Runnable 接⼝。Runnable 接⼝只提供了⼀个public void run( )⽅法,定义⼀个类实现Runnable接⼝,并将该类的实例作为参数传给Thread类的⼀个构造函数,从⽽创建⼀个线程;(2)继承 Thread 类。Thread 类本⾝实现了Runnable接⼝,通过继承Thread类,重写其中的run( )⽅法定义线程体,然后创建该⼦类的对象创建线程。4.什么是线程调度?Java的线程调度策略是什么?在Java中,为了充分发挥系统的性能,提⾼多线程并发程序的执⾏效率,需要定义⼀定的策略或规则,分配各个线程对CPU的使⽤权,这就是线程调度。Java的线程调度策略是⼀种基于优先级的抢先式调度。这种调度策略的含义是:Java 基于线程的优先级选择⾼优先级的线程进⾏运⾏。该线程(当前线程)将持续运⾏,直到它中⽌运⾏,或其它⾼优先级线程成为可运⾏的。在后⼀种情况,低优先级线程被⾼优先级线程抢占运⾏。5.线程的⽣命周期中包含⼏个状态?各状态之间是如何进⾏转换的?线程⽣命周期状态主要包括:新建状态(new )、可运⾏状态(Runnable)、运⾏状态(Running)、阻塞状态(Blocked)和终⽌状态(Dead)。调⽤⼀个线程类的构造⽅法,便创建了⼀个线程;新建的线程调⽤start()⽅法,将使线程的状态从New转换为Runnable;线程依照调度策略获得CPU使⽤权,则进⼊运⾏状态。运⾏状态是线程占有CPU并实际运⾏的状态。此时线程状态的变迁有三种情况:(1)如果线程正常执⾏结束或应⽤程序停⽌运⾏,线程将进⼊终⽌状态。终⽌状态是线程执⾏结束的状态,没有任何⽅法可改变它的状态。(2)如果当前线程执⾏了yield( )⽅法,或者当前线程因调度策略由系统控制进⼊可运⾏状态。(3)如果发⽣下⾯⼏种情况时,线程就进⼊阻塞状态:线程调⽤了 sleep( )⽅法、join( )⽅法,进⼊阻塞状态。睡眠时间到或所等待的线程结束时,进⼊可运⾏状态;线程调⽤wait( )⽅法时,由运⾏状态进⼊阻塞状态。线程若被notify( )等唤醒或被中断、或者等待时间到,线程将进⼊对象锁阻塞状态。如果线程中使⽤synchronized 来请求对象的锁未获得时,也将进⼊对象锁阻塞状态。该状态下的线程当获得对象锁后,将进⼊可运⾏状态。中采⽤什么机制实现多线程的同步?Java多线程同步采⽤传统的封锁技术。程序中各个并发线程中对同⼀个对象进⾏访问的代码段,称为临界区(CriticalSections)。临界区⽤“synchronized”关键字标识。Java 通过控制临界区代码的执⾏,实现线程的同步。临界区的控制是通过对象锁进⾏的。Java 平台将每个由synchronized(someObject){}语句指定的对象someObject设置⼀个锁,称为对象锁(Monitor)。对象锁是⼀种独占的排它锁(Exclusive locks),即当⼀个线程获得了对象的锁后,便拥有该对象的操作权,其他任何线程不能对该对象进⾏任何操作。线程在进⼊临界区时,⾸先通过synchronized(someObject)语句测试并获得对象的锁,只有获得对象锁才能继续执⾏临界区中的代码,否则将进⼊等待状态。7.线程创建后如何启动?下列哪些⽅法是Thread类的静态⽅法?哪些⽅法在Java 2中已经不建议使⽤?run(); start(); stop(); suspend(); resume(); sleep(); yield()。线程创建后,调⽤start()⽅法将使线程进⼊可运⾏状态,在这种状态下线程依照调度策略获得CPU使⽤权,则进⼊运⾏状态。下列⽅法中,sleep()和yield()是Thread类的静态⽅法。stop()、 suspend()和 resume()⽅法在Java 2中已经不建议使⽤。第⼗⼀章 Java⽹络程序设计对⽹络编程提供了哪些⽀持?Java提供了两个不同层次的⽹络⽀持机制:(1)URL层次。Java提供了使⽤URL访问⽹络资源的类,使得⽤户不需要考虑URL中标识的各种协议的处理过程,就可以直接获得URL资源信息。这种⽅式适⽤于访问Interent尤其是WWW上的资源。(2)Socket层次。Java中提供了对应Socket机制的⼀组类,⽀持流和数据报两种通信过程。这种机制中,⽤户需要⾃⼰考虑通信双⽅约定的协议,虽然烦琐但具有更⼤的灵活性和更⼴泛的适⽤领域。⽀持URL的类,实际上也是依赖于下层⽀持Socket通信的类来实现的,不过这些类中已有⼏种主要协议的处理,如ftp,Http等。2.利⽤URL通信机制可以使⽤哪些⽅式进⾏⽹络通信?⼀种⽅式是从URL直接读取。当成功创建了URL对象后,就可以利⽤该对象访问⽹上的资源。通过URL可以象访问本地⽂件⼀样访问⽹络上其它主机中的⽂件。除了这种使⽤⽅法之外,还可以通过URL的openStream()⽅法,得到tream类的对象,从该输⼊流⽅便地读取URL地址的数据。另⼀种⽅式是通过URLConnection类在应⽤程序与URL 之间建⽴⼀个连接,通过URLConnection类的对象,对URL所表⽰的资源进⾏读、写操作。3.基于Socket可以实现哪两种通信?简述这两种通信的⼯作原理。基于Socket可以实现有连接通信⽅式和数据报通信⽅式。Java的有连接通信采⽤流式I/O模式。Socket是两个进程间通信链的端点,每个Socket 有两个流:⼀个输⼊流和⼀个输出流。只要向Socket的输出流写,⼀个进程就可以通过⽹络连接向其它进程发送数据;同样,通过读Socket的输⼊流,就可以读取传输来的数据。有连接通信⼀般要经历四个基本步骤:创建Socket,建⽴连接;打开连接到Socket的输⼊/输出流;按照⼀定的协议对Socket进⾏读/写操作;关闭Socket。Java在/doc/ 包中提供了两个类:DatagramSocket和DatagramPacket⽀持采⽤UDP 协议的数据报⽅式通信。采⽤数据报⽅式进⾏通信的过程主要分为以下三个步骤:创建数据报Socket;构造⽤于接收或发送的数据报,并调⽤所创建Socket的receive()⽅法进⾏数据报接收或调⽤send()发送数据报;通信结束,关闭Socket。第⼗⼆章 JDBC技术1.试述JDBC的体系结构。JDBC技术的主要思想就是为应⽤程序访问数据库提供统⼀的接⼝,屏蔽各种数据库之间的异构性,保证Java程序的可移植性。在JDBC技术中,程序员使⽤JDBC API将标准的SQL语句通过JDBC驱动管理器(JDBC Driver Manager)传递给相应的JDBC驱动(JDBC Driver),并由该JDBC驱动传送给所指定的数据库服务器。JDBC体系结构如下图所⽰。驱动有哪⼏种类型?JDBC驱动有四种类型:JDBC-ODBC桥、本地API部分Java驱动、⽹络协议完全Java 驱动、本地协议完全Java驱动。JDBC-ODBC桥,实际上是利⽤了现有的ODBC,它将JDBC调⽤翻译为ODBC的调⽤;本地API部分Java驱动将JDBC调⽤转换成对特定DBMS客户端API的调⽤;⽹络协议完全Java 驱动将JDBC的调⽤转换为独⽴于任何DBMS的⽹络协议命令,并发送给⼀个⽹络服务器中的数据库中间件,该中间件进⼀步将⽹络协议命令转换成某种DBMS所能理解的操作命令;本地协议完全Java驱动直接将JDBC的调⽤转换为特定DBMS所使⽤的⽹络协议命令,并且完全由Java语⾔实现。3.利⽤JDBC开发数据库应⽤的⼀般步骤是什么?利⽤JDBC开发数据库应⽤⼀般包括如下步骤:(1)建⽴与数据库的连接。(2)执⾏SQL语句。(3)处理结果集。(4)关闭数据库连接。4.什么是预编译语句?怎样使⽤预编译语句?预编译语句PreparedStatement是中的⼀个接⼝,它是Statement的⼦接⼝。在创建PreparedStatement对象时就指定了SQL语句,该SQL语句将⽴刻发送给DBMS进⾏编译。当该预编译语句被执⾏时,DBMS可以直接运⾏编译后SQL语句。另外,预编译语句还⽀持带有参数的SQL语句,这使得我们可以对相同的SQL语句替换参数从⽽多次使⽤。因此,当⼀个SQL语句需要执⾏多次时,使⽤预编译语句可以减少执⾏时间,提⾼执⾏效率。⼀般是在需要反复使⽤⼀个SQL语句时,使⽤预编译语句。因此预编译语句常常放在⼀个for或while循环中使⽤,通过循环反复设置参数从⽽多次使⽤该SQL语句。5.什么是存储过程?怎样使⽤存储过程?存储过程是封装了对数据库更新或查询操的⼀组SQL语句,形成⼀个相对独⽴的逻辑单元,能够完成特定的任务。存储过程可以带有参数。在Java程序中通过JDBC可以调⽤存储过程。⾸先要通过⼀个打开的数据库连接创建⼀个CallableStatement类型的对象,该对象将包含对存储过程的调⽤。然后再调⽤该对象的executeQuery()⽅法执⾏存储过程。6.什么是事务?怎样实现事务操作?事务是保证数据库中数据的完整性与⼀致性的重要机制。事务由⼀组SQL语句组成,具有原⼦性,即这组语句要么都执⾏,要么都不执⾏。JDBC中实现事务操作,关键是下⾯Connection接⼝的三个⽅法:通过调⽤当前连接的setAutoCommit(false)来关闭这种⾃动提交模式,从⽽把多个SQL语句作为⼀个事务;调⽤连接的commit()⽅法提交事务;当⼀个事务执⾏过程中出现异常⽽失败时,为了保证数据的⼀致性,必须调⽤连接的rollback()⽅法使事务回滚。 2.0与JDBC 3.0中增加了哪些新特性?JDBC 2.0主要增加了下列功能:在SQL语句执⾏所返回的结果集中,可以向前或向后滚动记录,并可以定位到指定的记录;利⽤Java API对数据库表中的数据进⾏更新;批量更新操作;使⽤SQL3中的数据类型。JDBC 3.0在预编译语句、存储过程调⽤、结果集处理以及所⽀持的数据类型等⽅⾯增加了很多功能,如数据库连接池的操作与配置,事务处理中安全点(Save point)的⽀持等。 4.0中增加了哪些新特性?在JDBC4.0中,提供了更好的代码可管理性和灵活性,并且⽀持更复杂的数据类型。JDBC4.0新特性或新的增强主要体现在驱动和连接管理、异常处理、数据类型⽀持以及增加API等⽅⾯。
2023年6月20日发(作者:)
Java语⾔程序的设计第三版_习题答案第⼀章绪论1.简述Java技术体系的组成。Java技术体系主要由三部分组成:Java平台标准版Java SE,Java平台企业版Java EE,以及Java 平台微缩版Java ME。Java SE为Java桌⾯和⼯作组级应⽤的开发与运⾏提供了环境。它的实现主要包括Java SE Development Kit(JDK)和JavaSE Runtime Environment(JRE)。Java SE提供了编写与运⾏Java Applet与Application的编译器、开发⼯具、运⾏环境与Java API。Java EE 定义了基于组件的多层企业级应⽤的开发标准,⾯向企业级和⾼端服务器的Internet应⽤开发。它基于Java SE,包括Enterprise JavaBeans(EJB),Java Servlets API以及Java Server Pages(JSP)等技术,并为企业级应⽤的开发提供了各种服务和⼯具。Java ME是针对消费类电⼦设备如移动、电视置顶盒、汽车导航系统等的嵌⼊式计算的⼀组技术和规。2.Java的特征有哪些?简述这些特征的含义。Java语⾔的特征包括:简单(Simple)、⾯向对象(Object oriented)、分布式(Distributed)、解释型(Interpreted)、健壮(Robust)、安全(Secure)、体系结构中⽴(Architecture neutral)、可移植(Portable)、⾼性能(Highperformance)、多线程(Multithreaded)和动态(Dynamic)●简单性:Java语⾔语法和语义都⽐较单纯,容易学习和使⽤。另外,去掉C++中的指针,取消多重继承和运算符重载,存管理由程序员移向Java嵌的⾃动存回收机制等●⾯向对象:作为⼀种⾯向对象的编程语⾔,Java不仅最为“纯洁”,也对⾯向对象⽅法学的⽀持也最为全⾯。Java的对象有模块化性质和信息隐藏能⼒,满⾜⾯向对象的封装要求,同时⽀持继承和多态。●分布式:Java⽀持的分布式计算包括两种层次:⼀是数据分布,即应⽤系统所操作的数据可以分散存储在不同的⽹络节点上,可以通过Java的URL类访问。⼆是操作分布,即应⽤系统的计算可通过嵌在WWW页⾯中的Applet(⼩应⽤程序),分布到不同的⽹络节点完成。●半编译,半解释:采⽤编译器对程序进⾏编译,但编译得到的是⼀种中性的字节码,并不是本机代码,⽽字节码的执⾏采取解释执⾏⽅式。该特征,提⾼了Java 的可移植性,并使得Java语⾔兼具编译执⾏的效率优势和解释执⾏的灵活性。●健壮性:Java提供⾃动垃圾收集来进⾏存管理,防⽌程序员在管理存时容易产⽣的错误。通过集成的⾯向对象的例外处理机制,帮助程序员正确地进⾏选择以防⽌系统的崩溃。另外,Java是⼀种强类型语⾔,程序编译时要经过严格的类型检查,防⽌程序运⾏时出现类型不匹配等问题。●安全性:Java在语⾔和运⾏环境中引⼊了多级安全措施,其采⽤的主要安全机制有:存分配及布局由Java 运⾏系统规定。运⾏系统执⾏基于数字签名技术的代码认证、字节码验证与代码访问权限控制的安全控制模型。●体系结构中⽴:Java为了做到结构中⽴,除了上⾯提到的编译⽣成机器⽆关的字节码外,还制定了完整统⼀的语⾔⽂本。为了使Java 的应⽤程序能不依赖于底层具体的系统,Java 语⾔环境还提供了⼀个⽤于访问底层操作系统功能的可扩展类库,当程序使⽤这些库时,可以确保它能运⾏在⽀持Java 的各种平台上。●可移植性:Java的最⼤特点是“⼀次编程,处处运⾏”。任何机器只要配备了Java解释器,便可运⾏Java程序。这种可移植性源于两⽅⾯:⼀是Java的半编译、半解释特征;另⼀⽅⾯是Java体系结构中⽴,采⽤标准的独⽴于硬件平台的数据类型。●⾼性能:Java语⾔的字节码与机器码⼗分接近,使得字节码到机器码的转换⼗分快捷。另外,Java还提供了即时编译技术,提⾼了Java应⽤的运⾏速度。●多线程:Java的特点是在语⾔级嵌⼊了多线程机制,⽀持程序的并发处理功能。从程序的⾓度看,⼀个线程就是应⽤程序中的⼀个执⾏流。Java 将临界区保护规则等集成到语⾔中实现线程同步,使这些规则的使⽤更加⽅便有效。●动态特性:Java程序的基本组成单元是类,⽽Java的类⼜是运⾏时动态装载的,这使将Java可以动态地维护应⽤程序及其⽀持类之间的⼀致性。3.Java语⾔的语法机制与C/C++有何异同?Java的基本语法机制,例如:数据类型、表达式、程序流控制、结构化异常处理等,都与C++相同。明显区别于C++的语法机制,包括类(class)、接⼝(Interface)、程序包(package)、多线程以及取消指针。4.Java运⾏系统由哪些部分组成?Java程序的运⾏过程是怎样的?Java运⾏系统⼀般包括以下⼏部分:类装配器、字节码验证器、解释器、代码⽣成器和运⾏⽀持库。Java运⾏系统运⾏的是字节码即.class⽂件。执⾏字节码的过程可分为三步:(1)代码的装⼊由类装配器装⼊程序运⾏时需要的所有代码,其中包括程序代码中调⽤到的所有类。当装⼊了运⾏程序需要的所有类后,运⾏系统便可以确定整个可执⾏程序的存布局。(2)代码的验证由字节码检验器进⾏安全检查,以确保代码不违反Java的安全性规则,同时字节码验证器还可发现操作数栈溢出、⾮法数据类型转化等多种错误。(3)代码的执⾏Java字节码的运⾏可以有两种⽅式:即时编译(Just-In-Time)⽅式和解释执⾏⽅式。5.什么是JVM?Java虚拟机是⼀个想象中的,能运⾏Java字节码的操作平台。⽽JVM规提供了这个平台的严格的规说明,包括指令系统,字节码格式等。JVM进⼀步可⽤软件在不同的计算机系统上实现或⽤硬件实现。JVM的实现包括字节码验证、解释器、存垃圾回收等,是上述Java 运⾏系统的核⼼,Java运⾏系统是各供应商对JVM的具体实现。7.编写⼀个Java程序,在屏幕上输出“欢迎学习Java语⾔!”的字符串。public class Welcome{public static void main (String args[]){n("欢迎学习Java语⾔!");}}第⼆章⾯向对象程序设计基本概念1.什么是对象?什么是类?什么是实体?它们之间的相互关系是怎样的?试举例说明。在⾯向对象⽅法中,对象是现实世界实体或概念在计算机世界中的抽象表⽰,是具有唯⼀对象名、固定对外接⼝的⼀组变量/属性和⽅法的集合,是⽤来模拟组成或影响现实世界问题的⼀个或⼀组因素。类定义了对象类型,包含同⼀类型的对象具有共同的特征与⾏为。使⽤class定义的类在程序中称为⼀种抽象数据类型,它是⾯向对象程序设计语⾔的基本概念。⼀个类在定义后,我们就可以象使⽤其它数据类型⼀样,声明该类的变量并创建该变量所指向的对象,然后通过该变量调⽤对象的⽅法实现对对象的操作。实体表⽰现实世界中,客观存在并可区分的事物或概念。在⾯向对象的问题求解⽅法中,⾸先对现实世界的问题域进⾏语义抽象,从各类对象中抽象出对象类型,并得到对象类型之间的关联,形成问题的概念模型。接下来,进⾏概念模型到机器(程序)模型的转换得到机器世界的模型。机器模型是由计算机能够理解和处理的类构成的。将类实例化就得到了现实世界实体的⾯向对象的映射——对象,在程序中对对象进⾏操作,就可以模拟现实世界中的实体及实体之间相互作⽤,解决由这些实体构成的现实世界中的问题。举例来说,我们很多⼈都有⾃⾏车,你的⾃⾏车就是“⾃⾏车”这类交通⼯具中的⼀个实例,即现实世界的⼀个实体。在机器世界中即程序中的⾃⾏车类包含了⾃⾏车都有相同的状态,例如两个轮⼦、脚踏板速度等,以及共同的⾏为,如刹车等,将⾃⾏车类实例化就得到了现实世界的⾃⾏车实体的映射——⾃⾏车对象,在程序中对这个对象进⾏操作,就可以模拟现实世界中的⾃⾏车与其他实体之间相互作⽤。2.什么是对象的状态与⾏为?设有对象“学⽣”,试给出这个对象的状态和⾏为。现实世界的对象具有两个特征:状态与⾏为。⾯向对象程序设计语⾔中的对象是以现实世界的对象为模型构造的,也具有状态与⾏为,其中状态保存在⼀组变量中,⽽对象的⾏为通过⽅法实现。“学⽣”的状态包括:学号、、年龄、所属院系、专业⽅向等;“学⽣”的⾏为包括:注册、选课、基本信息维护等。3.什么是封装与数据隐藏?使⽤对象的对外接⼝(⽅法)将对象的变量与⽅法实现保护起来,外界只能通过对象的接⼝访问对象的服务,⽽对对象其它成员都⽆法访问,就称为封装。因此,对象中的数据封装同时也实现了对象的数据隐藏。数据隐藏是通过对象成员的访问控制实现的。在Java语⾔中提供了四种不同层次的访问控制,即public,protected,default和private,从⽽实现了对象四种不同程度的数据隐藏。4.什么是上溯造型?什么是晚联编?多态的含义是什么?上溯造型的含义是⼦类沿着类继承体系向上,将其类型塑造为⽗类类型,使得⼦类对象能够当作⽗类对象处理。程序中调⽤对象的⽅法时,所调⽤的代码直到运⾏时刻才确定。因此,在程序编译时,编译器可以保证该⽅法存在并且执⾏参数与返回结果的类型检查,但却不知道要执⾏的准确代码。在运⾏时刻,Java运⾏系统根据对象变量当时所指向对象的实际类型,调⽤该对象的相应⽅法。这种技术称为晚联编。⾯向对象的多态特征,简⽽⾔之就是“对外⼀个接⼝,部多种实现”。⾯向对象程序设计语⾔⽀持两种形式的多态:运⾏时多态和编译时多态。编译时多态主要是通过重载(Overloading)技术实现的,即在⼀个类中相同的⽅法名可⽤来定义多种不同的⽅法。运⾏时多态是在⾯向对象的继承性的基础上建⽴的,是运⾏时动态产⽣的多态性,是⾯向对象的重要特性之⼀。5.怎样理解⾯向对象程序设计⽅法的涵?⾯向对象程序设计⽅法的涵,可以由对象、数据抽象、封装、继承和多态等核⼼概念和特征表达:程序中所有东西都是对象;程序是⼀系列对象的组合;每个对象都有⾃⼰的存储空间,可以容纳其它对象;每个对象都有⼀种类型,即都归属于⼀个类,类最主要的特征是对外接⼝;同⼀类型的所有对象都能够接收相同的消息,⼦类与⽗类具有“同⼀类型”,这就是⾯向对象程序语⾔中的多态性。6.⾯向对象程序设计有哪些优点?⾯向对象程序设计⽅法的主要优势是具有更好的可重⽤性、可扩展性、可管理与维护性。在⾯向对象程序设计中,可重⽤的代码是类和对象。数据抽象、封装、继承、多态等特征都围绕和体现了代码重⽤的思想。⾯向对象的封装、继承和多态使得程序可以对⼀个类的部变量和⽅法进⾏修改或增加新的变量和⽅法,可以按照需要派⽣新的⼦类,但仍可以保证调⽤这些类接⼝的程序不做改动,从⽽使程序具有很强的可扩展性与易维护性。⽽⾯向对象的数据抽象与封装,使程序具有模块化特性,这简化了程序中代码之间的关联,使程序更易于管理和控制。第三章 Java语⾔基础1.下列标识符哪些是合法的?$88,#67,num,applet,Applet,7#T,b++,--b合法的标识符:$88,num,applet,Applet2.Java有哪些基本数据类型?什么是复合数据类型?对于这两种类型的变量,系统的处理有什么不同?Java基本数据类型包括:boolean,char,byte,short,int,long,double和float 复合数据类型:⼀般将⽤户定义的新类型称为复合数据类型。Java以类和接⼝的形式定义新类型。因此在Java中类和接⼝是两种⽤户定义的复合数据类型。对于这两种类型的变量,系统的处理⽅式:基本数据类型的变量包含了单个值,这个值的长度和格式符合变量所属数据类型的要求,基本类型变量声明时,系统直接给该变量分配空间,因此程序中可以直接操作。引⽤型变量的值是指向存空间的引⽤(地址),声明时只是给该变量分配引⽤空间,数据空间未分配。引⽤型变量在声明后必须通过实例化开辟数据空间,才能对变量所指向的对象进⾏访问。3.设变量i和j的定义如下,试分别计算下列表达式的值。inti=1;double d=1.0(1)35/4; (2)46%9+4*4-2; (3)45+43%5*(23*3%2); (4)45+45*50%i--;(5)45+45*50%(--i); (6)1.5*3+(++d); (7)1.5*3+d++;(8)i+=3/i+3;(1)8;(2)15;(3)48;(4)45;(5)除0异常;(6)6.5;(7)5.5;(8)74.计算下列逻辑运算表达式的值:(1) (true) && (3 > 4)(2) !(x> 0) && (x > 0)(3) (x > 0) || (x < 0)(4) (x != 0) || (x == 0)(5) (x >= 0) || (x < 0)(6) (x != 1) == !(x == 1)(1)false(2)false(3)如果x=0,为false; 如果x!=0, 为true(4)true(5)true(6)true5.Java中有哪些类型程序流控制语句?Java语⾔提供了4类程序流控制语句:●循环语句,包括while语句、do while 语句和for语句。●分⽀语句,包括if语句和switch语句。●跳转语句,包括break语句, continue语句, label:语句, return语句.●异常处理语句,包括try-catch-finally语句和throw语句。6.switch语句与if语句可以相互转换吗?使⽤switch语句的优点是什么?switch语句可以转换为if语句,但if语句不⼀定能转换为switch语句。因为switch 以⼀个整型表达式的值作为判定条件,⽽if可以判断各种条件。使⽤switch结构更简单,可读性强,⽽且程序的执⾏效率也得到提⾼。7.试写出下列循环的运⾏结果。Int i = 1;while(i<10){if ((i++)%2 ==0){n(i);}}35798.While循环和do循环有什么区别?while语句运⾏时,先计算逻辑表达式的值,当值为“true”时,执⾏循环体语句。do while 语句⾸先执⾏循环体中的语句,然后再求表达式的值,如果为“true”则继续循环;如果为“false”, 则终⽌循环。因此, dowhile循环⾄少要执⾏⼀次循环体。9.循环跳转语句break的作⽤是什么?试给出下列程序的运⾏结果。inti = 1000;while(true){if(i<10){break;}i = i-10;}n("The value of i is "+i);break语句⽤来从switch语句、循环语句中跳出。它结束了switch语句的执⾏,并把控制流转移到紧跟在switch之后的语句。我们还可以使⽤不带标签的break语句终⽌循环。带标签的break语句结束由标签指定的外层语句的执⾏。上述程序的运⾏结果是:The value of i is 010.循环跳转语句continue的作⽤是什么?试给出下列程序的运⾏结果。inti = 1000;while(true){if(i<10){continue;}i = i-10;}在for、while和do while循环中,continue语句跳过当前循环的其余语句,执⾏下⼀次循环。不带标签的continue语句跳过最层的循环,并开始执⾏最层循环的下⼀次循环。上述程序当i的值为0以后,将进⼊死循环。13.下列数组声明哪些是合法的?(1)inti = new int(30);(2)double d[] = new double[30];(3)Integer[] r = new Integer(1..30);(4)inti[] = (3, 4, 3, 2);(5)float f[] = {2.3, 4.5, 5.6};(6)char[] c = new char();(7)Integer[][] r = new Integer[2];合法声明语句:(2)14.数组变量是基本类型变量还是引⽤型变量?数组的存是在什么时候分配的?数组变量是引⽤型变量。数组的声明并不创建实例数组的数据空间,⽽是给该数组变量分配了⼀个可⽤来引⽤该数组的引⽤空间。数组元素所需的存空间是通过new运算符或通过数组初始化分配的。第四章 Java⾯向对象特性1.试说明JAVA语⾔是如何⽀持多重继承的。Java中是通过接⼝实现多重继承的。接⼝(interface)机制,允许⼀个类实现多个接⼝。这样既避免了多重继承的复杂性,⼜达到了多继承的效果。2.类的构造⽅法和成员⽅法之间有什么区别?类的构造⽅法是⾮常特殊的⽅法,与成员⽅法的区别包括:(1)构造⽅法的名称必须与类名相同。(2)构造⽅法不能有返回值。(3)⽤户不能直接调⽤构造⽅法,必须通过关键字new⾃动调⽤它。中⽅法调⽤的参数传递⽅式是什么?Java中⽅法调⽤的参数传递⽅式是传值,即⽅法调⽤不会改变调⽤程序中作为⽅法参数的变量的值。当⽅法的参数类型是对象或数组等引⽤类型时,在⽅法中可能改变引⽤型参数所指向的对象的容,但是对象的引⽤不会改变。关键字的作⽤是什么?this是Java使⽤的⼀个有特定意义的引⽤,它指向当前对象⾃⾝。7.⼀个类中的⽅法,要使同⼀个包中的类可以访问⽽其它类不能访问,应该使⽤怎样的访问控制?对于该⽅法不加任何访问权限限定,即使⽤缺省的访问权限——default或package。8.什么是⽅法重载?⽅法重载的规则是什么?⽅法的重载是在⼀个类的定义中,多个⽅法使⽤相同的⽅法名,这些⽅法功能类似但参数不同。Java中规定重载的⽅法必须遵循下列原则:(1)⽅法的参数表必须不同,包括参数的类型或个数,以此区分不同⽅法体;(2)⽅法的返回类型、修饰符可以相同也可不同。9.什么是⽅法重写?⽅法重写的规则是什么?重写(Overriding)是指⼦类重新实现从⽗类继承⽽来的成员⽅法。Java中⽅法重写要遵守以下规则:(1)⼦类中重写⽅法的返回值类型必须与⽗类中被重写⽅法的返回值类型相同。(2)⼦类中重写⽅法的访问权限不能缩⼩。(3)⼦类中重写⽅法不能抛出新的异常。10.试说明JAVA语⾔中多态的含义及实现机制。多态的含义是,对外⼀个接⼝,部多种实现。Java中的多态包括运⾏时多态和编译时多态。编译时多态主要是通过重载(Overloading)技术实现的,运⾏时多态是通过上溯造型和动态联编技术实现的。上溯造型使⼀个对象既可以当作它⾃⼰的类型也可以作为其⽗类的类型对待,这意味着⼦类对象可作为⽗类的对象使⽤;⽗类的对象变量可以指向⼦类对象。这样通过⼀个⽗类变量发出的⽅法调⽤,可能执⾏的是该⽅法在⽗类中的实现,也可能是在某个⼦类中的实现,这只能在运⾏时刻根据该变量指向的具体对象类型确定,这就是运⾏时多态。11.给出下列程序的运⾏结果:class Meal {Meal() { n("Meal()"); }}class Bread {Bread() { n("Bread()"); }}class Cheese {Cheese() { n("Cheese()"); }}class Lettuce {Lettuce() { n("Lettuce()"); }}class Lunch extends Meal {Lunch() { n("Lunch()"); }}classPortableLunch extends Lunch {PortableLunch() { n("PortableLunch()");}}public class Sandwich extends PortableLunch {private Bread b = new Bread();private Cheese c = new Cheese();private Lettuce l = new Lettuce();publicSandwich() {n("Sandwich()");}public static void main(String[] args) {new Sandwich();}}程序运⾏结果:Meal()Lunch()PortableLunch()Bread()Cheese()Lettuce()Sandwich()第五章 Java⾼级特征1.举例说明类⽅法与实例⽅法以及类变量与实例变量之间的区别。类⽅法要通过类名访问,实例⽅法需要通过实例对象访问。例如,/doc/ ng的System 类中的exit()⽅法。类变量只在系统加载其所在类时分配空间并初始化,并且在创建该类的实例时将不再分配空间,所有的实例将共享类的静态变量。类变量在类外直接⽤类名调⽤,⽽不象实例变量那样需要通过实例对象才能访问。例如,/doc/ ng的System中的out变量,该变量的定义为:static PrintStreamout,所以当我们需要向监控台输出信息时,可以在程序中直接调⽤n(“…….”)。2.什么是接⼝?接⼝的意义是什么?接⼝(interface)从定义形式上类似于抽象类。接⼝中声明了⽅法,但不定义⽅法体,因此接⼝只是定义了⼀组对外的公共接⼝。与类相⽐,接⼝只规定了⼀个类的基本形式,不涉及任何实现细节。实现⼀个接⼝的类将具有接⼝规定的⾏为。Java中规定⼀个类只能继承⼀个⽗类,但可以实现多个接⼝,因此利⽤接⼝实现了多重继承⽽没有强⾏形成类的继承关系。避免产⽣代码冲突,保证了Java的简单性与代码的安全可靠,同时对⾯向对象⽅法论的⽀持更纯洁。3.什么是包?如何定义包?包是Java中类和接⼝的⼀种组织、管理和使⽤的单位,是相关类与接⼝的⼀个集合,使类和接⼝易于查找和使⽤,并提供了独⽴的类命名空间和访问保护。使⽤package语句指定⼀个源⽂件中的类属于⼀个特定的包。Package语句的格式如下:package pkg1[.pkg2[.pkg3…]]。如果源⽂件中没有package语句,则指定为⽆名包。4.什么是抽象类?抽象类与接⼝有何区别?抽象类是包含⼀个或多个抽象⽅法的类,只有声明⽽没有⽅法体的⽅法称为抽象⽅法。抽象类也可有构造⽅法、普通的成员变量或⽅法,也可以派⽣抽象类的⼦类。但抽象类在使⽤上有特殊的限制,即不能创建抽象类的实例。抽象类与接⼝之间的区别:(1)接⼝中的所有⽅法都是抽象的,⽽抽象类可以定义带有⽅法体的不同⽅法。(2)⼀个类可以实现多个接⼝,⽽只能继承⼀个抽象⽗类。(3)接⼝与实现它的类不构成类的继承体系,即接⼝不是类体系的⼀部分。因此,不相关的类也可以实现相同的接⼝。⽽抽象类是属于⼀个类的继承体系,并且⼀般位于类体系的顶层。5.下列接⼝的定义,哪个是正确的?(1)interface Printable{void print(){ };}(2)abstract interface Printable{void print();}(3)abstract interface Printable extends Interface1,Interface2{void print(){ };}(4)interface Printable{void print();}正确的接⼝定义:(4)第六章异常处理1.什么是异常?Java异常处理有哪些⽅法?在程序运⾏时打断正常程序流程的任何不正常的情况称为错误或异常。例如,试图打开的⽂件不存在、⽹络连接中断、操作符越界和要加载的类找不到等。异常处理是指程序获得异常并处理,然后继续程序的执⾏。异常处理具体有两种⽅式:捕获并处理异常;将⽅法中产⽣的异常抛出。2.Java中的异常处理主要处理哪些类型的异常?Java的异常处理机制主要针对RuntimeException类型和除Error类型以外的其他Exception类型。RuntimeException意味着程序设计或实现问题,如:数组使⽤越界;算术运算异常(如除0运算);空指针异常即访问没有初始化的空指针等。正确设计与实现的程序不应产⽣这些异常。对于这类异常,处理的策略是纠正错误。其它的异常Exception类,通常是由环境因素引起的,例如:⽂件不存在,⽆效URL等。这类异常经常是由⽤户的误操作引起的,可以在异常处理中处理,例如提⽰⽤户进⾏正确操作等3.⽤户程序如何⾃定义异常?⾸先定义异常类,⽤户⾃定义的异常类定义为Exception类的⼦类。这样的异常类可包含普通类的容。定义了⾃定义异常类后,程序中的⽅法就可以在恰当的时候利⽤throw语句将该种异常抛出,注意要在⽅法的声明中声明抛出该类型的异常。之后,Java程序在调⽤声明抛出⾃定义异常的⽅法时,要进⾏异常处理。具体可以采⽤上⾯介绍的两种⽅式:利⽤try-catch-finally语句捕获并处理;声明抛出该类型的异常。4.系统异常如何抛出?⽤户⾃定义异常如何抛出?如果执⾏try块⾥的语句时出现系统定义异常,JVM会⾃动⽣成⼀个相应的异常对象,并定位相应的异常处理语句块。⽤户⾃定义异常类后,异常是在⽤户⽅法的声明中使⽤throws⼦句进⾏声明的,执⾏throw语句进⾏异常对象抛出。5.设下列try-catch语句块中的第⼆个语句s2将引起⼀个异常,试回答下列问题:try{s1;s2;s3;}catch(ExceptionType e1){ }catch(ExceptionTpye e2){ }s4;(1)s3会执⾏吗?产⽣异常后,s3不会执⾏,系统转型catch 语句匹配进⾏错误处理的语句。(2)如果异常未被捕获,s4会被执⾏吗?如果异常未被捕获,则运⾏流程会转型上⼀层调⽤程序,s4不会被执⾏。(3)如果catch⼦句捕获了异常,s4会执⾏吗?如果catch⼦句捕获了异常,s4会执⾏。第七章输⼊/输出1.什么是节点流?什么是过滤流或处理流?节点流:以特定源如磁盘⽂件、存某区域或线程之间的管道为端点构造的输⼊/输出流,它是⼀种最基本的流。过滤流:以其它已经存在的流为端点构造的输⼊/输出流,称为过滤流或处理流,它要对与其相连的另⼀个流进⾏某种转换。的输⼊/输出流可以实现哪些类型的输⼊/输出?存I/O;管道I/O;⽂件I/O;对象I/O;数据转换,即按基本数据类型读、写数据;缓存I/O,即对数据进⾏缓存,以减少I/O的次数;流数据计数;流预读,即通过缓存机制进⾏预读;字节与字符转换等。3.字节流与字符流之间有什么区别?字节流:流中的数据以8位字节为单位进⾏读写,以InputStream与OutputStream为基础类。字符流:流中的数据以16位字符为单位进⾏读写,以Reader与Writer为基础类。字节流与字符流的主要差别是处理的数据类型不同,其它基本相类似。4.管道流的主要⽤途是什么?如何创建管道流?管道流可以实现线程间数据的直接传输。线程之间通过管道传输数据与共享缓冲区⽅法相⽐,不需要进⾏线程同步,节省存并提⾼了程序的运⾏效率。管道流的创建是将管道输出流和管道输⼊流进⾏挂接。基于管道类的构造⽅法,可以采取下列两种⽅式创建管道流:PipedInputStream pin= new PipedInputStream( );PipedOutputStream pout = new PipedOutputStream(pin);或PipedInputStream pin= new PipedInputStream( );PipedOutputStream pout = new PipedOutputStream();t(out);或t(in);管道流创建后,需要把它的输出流连接到⼀个线程的输出流,并且把它的输⼊流连接到另⼀个线程的输⼊流,才能利⽤该管道流实现这两个线程之间的数据交流。AccessFile类实现了哪两个接⼝?具有哪些输⼊输出功能?RandomAccessFile类实现了DataInput和DataOutput接⼝。RandomAccessFile类提供的⽂件操作主要分为三类:对⽂件指针的操作、读操作与写操作。RandomAccessFile实现的是随机读写,即可以在⽂件的任意位置进⾏数据的读写。RandomAccessFile类可可以按数据类型读取数据,读⽅法主要包括:readBoolean(),readChar(),readInt(),readLong(),readFloat(),readDouble(),readLine(),readUTF()等。这些⽅法的功能与DataInputStream类中的同名⽅法相同。其中,readLine()从当前位置开始,到第⼀个‘n’为⽌,读取⼀⾏⽂本,它将返回⼀个String对象。RandomAccessFile 类具有类型转换功能的写操作⽅法。RandomAccessFile类包含的写⽅法主要包括:WriteBoolean(),WriteChar(),WriteUTF(),WriteInt(),WriteLong(),WriteFloat(),WriteDouble()等。8.什么是对象串⾏化?将Java程序中的对象保存在外存中,称为对象永久化。对象永久化的关键是将它的状态以⼀种串⾏格式表⽰出来,以便以后读该对象时能够把它重构出来。因此对Java对象的读、写的过程被称为对象串⾏化(Object Serialization)。Java 定义了ObjectInputStream类和ObjectOutputStream类实现对象的串⾏化。9.利⽤ObjectInputStream/ObjectOutputStream可以存取哪种类型的对象?写⼊对象的⽅法是什么?读取对象的⽅法是什么?如果⼀个对象它所对应的类实现了Serializable接⼝,则该对象是可以利⽤ObjectInputStream / ObjectOutputStream 进⾏存取,即ObjectInputStream /ObjectOutputStream 可以存取Serializable类型的对象。写⼊对象的⽅法,是ObjectOutputStream类的writeObject()⽅法;读取对象的⽅法是ObjectInputStream类的readObject()⽅法。第⼋章基于Swing的图形化⽤户界⾯与AWT最⼤的区别是什么?AWT定义各种组件(Components)类提供平台独⽴的API,然后利⽤特定于平台的各种类的实现(称为对等组件,peers)提供具有特定平台风格的L&F。Swing与AWT最⼤的区别是,Swing提供了丰富的组件,并且提供了独⽴于运⾏平台的GUI构造框架。Swing是纯Java实现的轻量级(Light-weight)组件,没有本地代码,不依赖操作系统的⽀持。Swing在不同的平台上都能够具有⼀致的显⽰风格,并且能够提供本地窗⼝系统不⽀持的其它特性。组件有哪些特性?Swing组件的特性包括:(1)组件的多样化(2)采⽤分离模型结构(Separable Model Architecture),即采⽤组件及与组件相关的数据模型(或简称模型)这样的分离结构。(3)可设置的组件外观感觉(Look and Feel,L&F)(4)⽀持⾼级访问⽅式,所有Swing组件都实现了Accessible接⼝,提供对⾮常规⾼级访问⽅式的⽀持。(5)Swing组件提供热键,⽀持键盘代替⿏标的操作(6)对Swing组件可以设置⼀个和多个边框。(7)可以在组件上使⽤图标中,能够向JFrame中直接添加组件吗?如何向JFrame中添加组件构造GUI?Swing组件不能直接添加到顶层容器中,必须添加到⼀个与顶层容器相关联的容⾯板(Content Pane)上。在JDK1.5后的版本中,为了⽅便使⽤,JFrame的add()⽅法被重写,可以把通过该⽅法添加的组件⾃动转交给容⾯板。向JFrame中添加组件可采⽤两种⽅式:(1)⽤getContentPane()⽅法获得JFrame的容⾯板,再使⽤add()⽅法向其中加⼊组件。(2)建⽴⼀个JPanel或JDesktopPane等中间容器,把组件添加到中间容器中,再⽤setContentPane()⽅法把该容器设置为JFrame的容⾯板,另外,在JDK1.5后的版本中,可以象操作AWT中的容器⼀样,直接对容器添加组件。4.AWT中⽀持⼏种布局管理器?它们各⾃的风格是怎样的?AWT⽀持的布局管理器包括:●FlowLayout——流式布局●BorderLayout——边界布局●GridLayout——⽹格布局●CardLayout——卡⽚布局●GridBagLayout——⽹格包布局FlowLayout容器的组件采⽤从左到右,从上到下逐⾏摆放。BorderLayout布局管理器将容器分为5个区:East、West、South、North、Center,可以将组件分别按东、西、南、北、中5个⽅位摆放。GridLayout布局管理器把容器分成n⾏m列同样⼤⼩的⽹格单元。每个⽹格单元可容纳⼀个组件,并且此组件将充满⽹格单元。组件按照从左⾄右,从上⾄下的顺序填充。CardLayout可以使两个或更多的组件(⼀般是Panel)共享同⼀显⽰空间。CardLayout 把这些组件像⼀系列卡⽚⼀样叠放,⼀个时刻只有最上⾯的是可见的。GridBagLayout的组件显⽰区域是⼀组动态的、矩形的⽹格单元,每个组件占有⼀个或多个⽹格单元。5.设计GUI的⼀般步骤是什么?基于Swing的应⽤程序GUI,⼀般包括如下部分:(1)引⼊Swing 包或AWT及其它程序包(2)选择GUI的外观风格L&F(3)创建并设置窗⼝容器,即创建GUI的顶层容器并进⾏布局管理器等设置(4)创建与添加Swing或AWT组件(5)显⽰顶层容器,将整个GUI显⽰出来6.试述委托⽅式(监听器⽅式)的事件处理机制。委托⽅式(监听器⽅式)的事件处理机制中,⾸先要定义监听器类。在Java中每类事件都定义了⼀个相应的监听器接⼝,该接⼝中定义了接收事件的⽅法。实现该接⼝的类,其对象可作为监听器注册。然后需要将监听器类的对象注册为组件的监听器。在GUI中,需要响应⽤户操作的相关组件要注册⼀个或多个相应事件的监听器,该监听器中包含了能接收和处理事件的事件处理⽅法。在该类事件产⽣时,事件对象只向已注册的监听器报告,并运⾏相应的事件处理⽅法。7.如何采⽤部类实现事件处理?事件适配器给监听器类的定义带来了⽅便,但同时也限制了监听器类对其它类的继承。为了既使⽤Adaptor类,⼜避免多重继承的限制,例如,假设我们要编写⼀个Applet程序,主类名称为MyApplet,MyApplet中要包含⿏标事件的处理⽅法。因为MyApplet类是Applet 类的⼦类,所以该类将不能再继承MouseAdapter。解决这个问题的有效⽅法是采⽤部类,,由部类继承相应Adaptor类。该类的对象可以作为执⾏事件处理的监听器注册。例如:public class MyClass extends Applet {...seListener(new MyAdapter());...classMyAdapter extends MouseAdapter {public void mouseClicked(MouseEvent e) {...//Event handler implementation }}}8.Window组件可以使⽤哪些类型的监听器?Window组件可以使⽤WindowListener,对窗⼝的打开、关闭、激活、去活等操作进⾏响应;WindowFocusListener,对窗⼝获得聚焦和失去聚焦的操作进⾏响应;WindowstateListener,当窗⼝的状态发⽣变化,如对最⼩化和最⼤化等操作进⾏响应。9.如何设置组件的颜⾊和字体?Component类是⼀个抽象类,是AWT中所有组件的⽗类,也是Swing中JComponent类⽗类,JComponent类是Swing中除了顶层容器外其他组件的⽗类。Component类为其⼦类提供了很多功能,包括提供⽅法setBackGround(),setForeGround(),setFont()等⽅法设置组件字体、颜⾊等。所以可以调⽤具体组件的上述⽅法进⾏颜⾊和字体的设置。第九章 Applet程序设计的运⾏过程是怎样的?Applet的运⾏包括如下四个步骤:(1)浏览器加载指定URL中的HTML⽂件;(2)浏览器解析HTML⽂件;(3)浏览器加载HTML⽂件中指定的Applet类;(4)浏览器中的Java运⾏环境运⾏该Applet。⽣命周期相关的⽅法有哪些?这些⽅法是如何被调⽤的?Applet⽣命周期相关⽅法包括init(),start(), stop(),destroy()等4种⽅法。init()是在装载Applet时被调⽤,使Applet执⾏⼀些基本初始化。start()是在init()⽅法之后被调⽤,使Applet成为激活状态。stop()是在浏览器离开含有Applet的⽹页时被调⽤,可⽤该⽅法暂时停⽌线程。Destroy()是在浏览器完全关闭之前被调⽤,彻底终⽌Applet,从存卸载并释放该Applet的所有资源。显⽰或刷新过程中要调⽤哪些⽅法?Applet在初次显⽰,或运⾏过程中浏览器窗⼝⼤⼩发⽣变化⽽引起Applet的显⽰发⽣变化时,将调⽤Applet的paint()⽅法进⾏Applet绘制。当Applet代码需要更新显⽰容时,则从程序中调⽤repaint()⽅法,则AWT线程在接受到该⽅法的调⽤后,将调⽤Applet的update()⽅法,⽽update()⽅法再调⽤组件的paint()⽅法实现显⽰的更新。t中是否可以添加AWT组件?为什么?JApplet中⼀般都使⽤Swing组件,⽽不使⽤AWT组件。因为应避免Swing组件与AWT 组件混合使⽤:在Swing GUI中应该全部使⽤轻量级组件,避免使⽤被称为重量级组件的AWT组件。第⼗章线程1.试述进程与线程之间的关系。进程是核级的实体。包含虚存映象、⽂件指⽰符,⽤户ID等。这些结构都在核空间中,⽤户程序只有通过系统调⽤才能访问与改变。线程是⽤户级的实体,是程序中的单个执⾏流,线程结构驻留在⽤户空间中,能够被普通的⽤户级函数组成的线程库直接访问。寄存器(栈指针,程序计数器)是线程专有的成分。⼀个进程可以通过运⾏多个线程来并发地执⾏多项任务,进程中的所有线程共享该进程的状态。中线程的模型由⼏部分构成?在Java中线程的模型就是⼀个CPU、程序代码和数据的封装体,即⼀个虚拟的CPU,该CPU 执⾏的代码,以及代码所操作的数据。3.创建线程的两种⽅式是什么?Java中线程体由Thread类的 run( ) ⽅法定义,有两种⽅式进⾏run( )⽅法的定义:(1)实现 Runnable 接⼝。Runnable 接⼝只提供了⼀个public void run( )⽅法,定义⼀个类实现Runnable接⼝,并将该类的实例作为参数传给Thread类的⼀个构造函数,从⽽创建⼀个线程;(2)继承 Thread 类。Thread 类本⾝实现了Runnable接⼝,通过继承Thread类,重写其中的run( )⽅法定义线程体,然后创建该⼦类的对象创建线程。4.什么是线程调度?Java的线程调度策略是什么?在Java中,为了充分发挥系统的性能,提⾼多线程并发程序的执⾏效率,需要定义⼀定的策略或规则,分配各个线程对CPU的使⽤权,这就是线程调度。Java的线程调度策略是⼀种基于优先级的抢先式调度。这种调度策略的含义是:Java 基于线程的优先级选择⾼优先级的线程进⾏运⾏。该线程(当前线程)将持续运⾏,直到它中⽌运⾏,或其它⾼优先级线程成为可运⾏的。在后⼀种情况,低优先级线程被⾼优先级线程抢占运⾏。5.线程的⽣命周期中包含⼏个状态?各状态之间是如何进⾏转换的?线程⽣命周期状态主要包括:新建状态(new )、可运⾏状态(Runnable)、运⾏状态(Running)、阻塞状态(Blocked)和终⽌状态(Dead)。调⽤⼀个线程类的构造⽅法,便创建了⼀个线程;新建的线程调⽤start()⽅法,将使线程的状态从New转换为Runnable;线程依照调度策略获得CPU使⽤权,则进⼊运⾏状态。运⾏状态是线程占有CPU并实际运⾏的状态。此时线程状态的变迁有三种情况:(1)如果线程正常执⾏结束或应⽤程序停⽌运⾏,线程将进⼊终⽌状态。终⽌状态是线程执⾏结束的状态,没有任何⽅法可改变它的状态。(2)如果当前线程执⾏了yield( )⽅法,或者当前线程因调度策略由系统控制进⼊可运⾏状态。(3)如果发⽣下⾯⼏种情况时,线程就进⼊阻塞状态:线程调⽤了 sleep( )⽅法、join( )⽅法,进⼊阻塞状态。睡眠时间到或所等待的线程结束时,进⼊可运⾏状态;线程调⽤wait( )⽅法时,由运⾏状态进⼊阻塞状态。线程若被notify( )等唤醒或被中断、或者等待时间到,线程将进⼊对象锁阻塞状态。如果线程中使⽤synchronized 来请求对象的锁未获得时,也将进⼊对象锁阻塞状态。该状态下的线程当获得对象锁后,将进⼊可运⾏状态。中采⽤什么机制实现多线程的同步?Java多线程同步采⽤传统的封锁技术。程序中各个并发线程中对同⼀个对象进⾏访问的代码段,称为临界区(CriticalSections)。临界区⽤“synchronized”关键字标识。Java 通过控制临界区代码的执⾏,实现线程的同步。临界区的控制是通过对象锁进⾏的。Java 平台将每个由synchronized(someObject){}语句指定的对象someObject设置⼀个锁,称为对象锁(Monitor)。对象锁是⼀种独占的排它锁(Exclusive locks),即当⼀个线程获得了对象的锁后,便拥有该对象的操作权,其他任何线程不能对该对象进⾏任何操作。线程在进⼊临界区时,⾸先通过synchronized(someObject)语句测试并获得对象的锁,只有获得对象锁才能继续执⾏临界区中的代码,否则将进⼊等待状态。7.线程创建后如何启动?下列哪些⽅法是Thread类的静态⽅法?哪些⽅法在Java 2中已经不建议使⽤?run(); start(); stop(); suspend(); resume(); sleep(); yield()。线程创建后,调⽤start()⽅法将使线程进⼊可运⾏状态,在这种状态下线程依照调度策略获得CPU使⽤权,则进⼊运⾏状态。下列⽅法中,sleep()和yield()是Thread类的静态⽅法。stop()、 suspend()和 resume()⽅法在Java 2中已经不建议使⽤。第⼗⼀章 Java⽹络程序设计对⽹络编程提供了哪些⽀持?Java提供了两个不同层次的⽹络⽀持机制:(1)URL层次。Java提供了使⽤URL访问⽹络资源的类,使得⽤户不需要考虑URL中标识的各种协议的处理过程,就可以直接获得URL资源信息。这种⽅式适⽤于访问Interent尤其是WWW上的资源。(2)Socket层次。Java中提供了对应Socket机制的⼀组类,⽀持流和数据报两种通信过程。这种机制中,⽤户需要⾃⼰考虑通信双⽅约定的协议,虽然烦琐但具有更⼤的灵活性和更⼴泛的适⽤领域。⽀持URL的类,实际上也是依赖于下层⽀持Socket通信的类来实现的,不过这些类中已有⼏种主要协议的处理,如ftp,Http等。2.利⽤URL通信机制可以使⽤哪些⽅式进⾏⽹络通信?⼀种⽅式是从URL直接读取。当成功创建了URL对象后,就可以利⽤该对象访问⽹上的资源。通过URL可以象访问本地⽂件⼀样访问⽹络上其它主机中的⽂件。除了这种使⽤⽅法之外,还可以通过URL的openStream()⽅法,得到tream类的对象,从该输⼊流⽅便地读取URL地址的数据。另⼀种⽅式是通过URLConnection类在应⽤程序与URL 之间建⽴⼀个连接,通过URLConnection类的对象,对URL所表⽰的资源进⾏读、写操作。3.基于Socket可以实现哪两种通信?简述这两种通信的⼯作原理。基于Socket可以实现有连接通信⽅式和数据报通信⽅式。Java的有连接通信采⽤流式I/O模式。Socket是两个进程间通信链的端点,每个Socket 有两个流:⼀个输⼊流和⼀个输出流。只要向Socket的输出流写,⼀个进程就可以通过⽹络连接向其它进程发送数据;同样,通过读Socket的输⼊流,就可以读取传输来的数据。有连接通信⼀般要经历四个基本步骤:创建Socket,建⽴连接;打开连接到Socket的输⼊/输出流;按照⼀定的协议对Socket进⾏读/写操作;关闭Socket。Java在/doc/ 包中提供了两个类:DatagramSocket和DatagramPacket⽀持采⽤UDP 协议的数据报⽅式通信。采⽤数据报⽅式进⾏通信的过程主要分为以下三个步骤:创建数据报Socket;构造⽤于接收或发送的数据报,并调⽤所创建Socket的receive()⽅法进⾏数据报接收或调⽤send()发送数据报;通信结束,关闭Socket。第⼗⼆章 JDBC技术1.试述JDBC的体系结构。JDBC技术的主要思想就是为应⽤程序访问数据库提供统⼀的接⼝,屏蔽各种数据库之间的异构性,保证Java程序的可移植性。在JDBC技术中,程序员使⽤JDBC API将标准的SQL语句通过JDBC驱动管理器(JDBC Driver Manager)传递给相应的JDBC驱动(JDBC Driver),并由该JDBC驱动传送给所指定的数据库服务器。JDBC体系结构如下图所⽰。驱动有哪⼏种类型?JDBC驱动有四种类型:JDBC-ODBC桥、本地API部分Java驱动、⽹络协议完全Java 驱动、本地协议完全Java驱动。JDBC-ODBC桥,实际上是利⽤了现有的ODBC,它将JDBC调⽤翻译为ODBC的调⽤;本地API部分Java驱动将JDBC调⽤转换成对特定DBMS客户端API的调⽤;⽹络协议完全Java 驱动将JDBC的调⽤转换为独⽴于任何DBMS的⽹络协议命令,并发送给⼀个⽹络服务器中的数据库中间件,该中间件进⼀步将⽹络协议命令转换成某种DBMS所能理解的操作命令;本地协议完全Java驱动直接将JDBC的调⽤转换为特定DBMS所使⽤的⽹络协议命令,并且完全由Java语⾔实现。3.利⽤JDBC开发数据库应⽤的⼀般步骤是什么?利⽤JDBC开发数据库应⽤⼀般包括如下步骤:(1)建⽴与数据库的连接。(2)执⾏SQL语句。(3)处理结果集。(4)关闭数据库连接。4.什么是预编译语句?怎样使⽤预编译语句?预编译语句PreparedStatement是中的⼀个接⼝,它是Statement的⼦接⼝。在创建PreparedStatement对象时就指定了SQL语句,该SQL语句将⽴刻发送给DBMS进⾏编译。当该预编译语句被执⾏时,DBMS可以直接运⾏编译后SQL语句。另外,预编译语句还⽀持带有参数的SQL语句,这使得我们可以对相同的SQL语句替换参数从⽽多次使⽤。因此,当⼀个SQL语句需要执⾏多次时,使⽤预编译语句可以减少执⾏时间,提⾼执⾏效率。⼀般是在需要反复使⽤⼀个SQL语句时,使⽤预编译语句。因此预编译语句常常放在⼀个for或while循环中使⽤,通过循环反复设置参数从⽽多次使⽤该SQL语句。5.什么是存储过程?怎样使⽤存储过程?存储过程是封装了对数据库更新或查询操的⼀组SQL语句,形成⼀个相对独⽴的逻辑单元,能够完成特定的任务。存储过程可以带有参数。在Java程序中通过JDBC可以调⽤存储过程。⾸先要通过⼀个打开的数据库连接创建⼀个CallableStatement类型的对象,该对象将包含对存储过程的调⽤。然后再调⽤该对象的executeQuery()⽅法执⾏存储过程。6.什么是事务?怎样实现事务操作?事务是保证数据库中数据的完整性与⼀致性的重要机制。事务由⼀组SQL语句组成,具有原⼦性,即这组语句要么都执⾏,要么都不执⾏。JDBC中实现事务操作,关键是下⾯Connection接⼝的三个⽅法:通过调⽤当前连接的setAutoCommit(false)来关闭这种⾃动提交模式,从⽽把多个SQL语句作为⼀个事务;调⽤连接的commit()⽅法提交事务;当⼀个事务执⾏过程中出现异常⽽失败时,为了保证数据的⼀致性,必须调⽤连接的rollback()⽅法使事务回滚。 2.0与JDBC 3.0中增加了哪些新特性?JDBC 2.0主要增加了下列功能:在SQL语句执⾏所返回的结果集中,可以向前或向后滚动记录,并可以定位到指定的记录;利⽤Java API对数据库表中的数据进⾏更新;批量更新操作;使⽤SQL3中的数据类型。JDBC 3.0在预编译语句、存储过程调⽤、结果集处理以及所⽀持的数据类型等⽅⾯增加了很多功能,如数据库连接池的操作与配置,事务处理中安全点(Save point)的⽀持等。 4.0中增加了哪些新特性?在JDBC4.0中,提供了更好的代码可管理性和灵活性,并且⽀持更复杂的数据类型。JDBC4.0新特性或新的增强主要体现在驱动和连接管理、异常处理、数据类型⽀持以及增加API等⽅⾯。
发布评论