1. 简述Java技术体系的组成。
Java技术体系主要由三部分组成:Java平台标准版Java SE,Java平台企业版Java EE,以及Java 平台微缩版Java ME。
Java SE为Java桌面和工作组级应用的开发与运行提供了环境。它的实现主要包括Java SE Development Kit(JDK)和Java SE 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)、高性能(High performance)、多线程(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[]){
System.out.println(\"欢迎学习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,Applet
2.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)7
4.计算下列逻辑运算表达式的值:
(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) true
5.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){
System.out.println(i); } }
3
5 7 9
8.While循环和do循环有什么区别?
while语句运行时,先计算逻辑表达式的值,当值为“true”时,执行循环体语句。do while 语句首先执行循环体中的语句,然后再求表达式的值,如果为“true”则继续循环;如果为“false”, 则终止循环。因此, dowhile循环至少要执行一次循环体。
9.循环跳转语句break的作用是什么?试给出下列程序的运行结果。
inti = 1000; while(true){
if(i<10){ break; }
i = i-10; }
System.out.println(\"The value of i is \"+i);
break语句用来从switch语句、循环语句中跳出。它结束了switch语句的执行,并把控制流转移到紧跟在switch之后的语句。我们还可以使用不带标签的break语句终止循环。带标签的break语句结束由标签指定的外层语句的执行。
上述程序的运行结果是:The value of i is 0
10.循环跳转语句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自动调用它。
5.Java中方法调用的参数传递方式是什么?
Java中方法调用的参数传递方式是传值,即方法调用不会改变调用程序中作为方法参数的变量的值。当方法的参数类型是对象或数组等引用类型时,在方法中可能改变引用型参数所指向的对象的内容,但是对象的引用不会改变。
6.this关键字的作用是什么?
this是Java使用的一个有特定意义的引用,它指向当前对象自身。
7.一个类中的方法,要使同一个包中的类可以访问而其它类不能访问,应该使用怎样的访问控制?
对于该方法不加任何访问权限限定,即使用缺省的访问权限——default或package。
8.什么是方法重载?方法重载的规则是什么?
方法的重载是在一个类的定义中,多个方法使用相同的方法名,这些方法功能类似但参数不同。
Java中规定重载的方法必须遵循下列原则:
(1) 方法的参数表必须不同,包括参数的类型或个数,以此区分不同方法体; (2) 方法的返回类型、修饰符可以相同也可不同。
9.什么是方法重写?方法重写的规则是什么?
重写(Overriding)是指子类重新实现从父类继承而来的成员方法。 Java中方法重写要遵守以下规则:
(1) 子类中重写方法的返回值类型必须与父类中被重写方法的返回值类型相同。 (2) 子类中重写方法的访问权限不能缩小。 (3) 子类中重写方法不能抛出新的异常。
10.试说明JAVA语言中多态的含义及实现机制。
多态的含义是,对外一个接口,内部多种实现。Java中的多态包括运行时多态和编译时多态。编译时多态主要是通过重载(Overloading)技术实现的,运行时多态是通过上溯造型和动态联编技术实现的。上溯造型使一个对象既可以当作它自己的类型也可以作为其父类的类型对待,这意味着子类对象可作为父类的对象使用;父类的对象变量可以指向子类对象。这样通过一个父类变量发出的方法调用,可能执行的是该方法在父类中的实现,也可能是在某个子类中的实现,这只能在运行时刻根据该变量指向的具体对象类型确定,这就是运行时多态。
11.给出下列程序的运行结果: class Meal {
Meal() { System.out.println(\"Meal()\"); } }
class Bread {
Bread() { System.out.println(\"Bread()\"); } }
class Cheese {
Cheese() { System.out.println(\"Cheese()\"); } }
class Lettuce {
Lettuce() { System.out.println(\"Lettuce()\"); } }
class Lunch extends Meal {
Lunch() { System.out.println(\"Lunch()\"); } }
classPortableLunch extends Lunch {
PortableLunch() { System.out.println(\"PortableLunch()\");} }
public class Sandwich extends PortableLunch {
private Bread b = new Bread(); private Cheese c = new Cheese(); private Lettuce l = new Lettuce(); publicSandwich() {
System.out.println(\"Sandwich()\");
}
public static void main(String[] args) {
new Sandwich();
} }
程序运行结果: Meal() Lunch()
PortableLunch() Bread() Cheese() Lettuce() Sandwich()
第五章 Java高级特征
1.举例说明类方法与实例方法以及类变量与实例变量之间的区别。
类方法要通过类名访问,实例方法需要通过实例对象访问。例如,java.lang的System类中的exit()方法。
类变量只在系统加载其所在类时分配空间并初始化,并且在创建该类的实例时将不再分配空间,所有的实例将共享类的静态变量。类变量在类外直接用类名调用,而不象实例变量那样需要通过实例对象才能访问。例如,java.lang的System中的out变量,该变量的定义为:
staticPrintStreamout,所以当我们需要向监控台输出信息时,可以在程序中直接调用
System.out.println(“…….”)。
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.什么是节点流?什么是过滤流或处理流?
节点流:以特定源如磁盘文件、内存某区域或线程之间的管道为端点构造的输入/输出流,它是一种最基本的流。
过滤流:以其它已经存在的流为端点构造的输入/输出流,称为过滤流或处理流,它要对与其相连的另一个流进行某种转换。
2.Java的输入/输出流可以实现哪些类型的输入/输出?
内存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(); pin.connect(out);或pout.connect(in); 管道流创建后,需要把它的输出流连接到一个线程的输出流,并且把它的输入流连接到另一个线程的输入流,才能利用该管道流实现这两个线程之间的数据交流。
6.RandomAccessFile类实现了哪两个接口?具有哪些输入输出功能?
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的图形化用户界面
1.Swing与AWT最大的区别是什么?
AWT定义各种组件(Components)类提供平台独立的API,然后利用特定于平台的各种类的实现(称为对等组件,peers)提供具有特定平台风格的L&F。Swing与AWT最大的区别是,Swing提供了丰富的组件,并且提供了独立于运行平台的GUI构造框架。Swing是纯Java实现的轻量级(Light-weight)组件,没有本地代码,不依赖操作系统的支持。Swing在不同的平台上都能够具有一致的显示风格,并且能够提供本地窗口系统不支持的其它特性。
2.Swing组件有哪些特性?
Swing组件的特性包括: (1)组件的多样化
(2)采用分离模型结构(Separable Model Architecture),即采用组件及与组件相关的数据模型(或简称模型)这样的分离结构。
(3)可设置的组件外观感觉(Look and Feel,L&F)
(4)支持高级访问方式,所有Swing组件都实现了Accessible接口,提供对非常规高级访问方式的支持。
(5)Swing组件提供热键,支持键盘代替鼠标的操作 (6)对Swing组件可以设置一个和多个边框。 (7)可以在组件上使用图标
3.Swing中,能够向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 { ...
someObject.addMouseListener(new MyAdapter()); ...
classMyAdapter extends MouseAdapter {
public void mouseClicked(MouseEvent e) {
...//Event handler implementation goes here... } } }
8.Window组件可以使用哪些类型的监听器?
Window组件可以使用WindowListener,对窗口的打开、关闭、激活、去活等操作进行响应;WindowFocusListener,对窗口获得聚焦和失去聚焦的操作进行响应;
WindowstateListener,当窗口的状态发生变化,如对最小化和最大化等操作进行响应。
9.如何设置组件的颜色和字体?
Component类是一个抽象类,是AWT中所有组件的父类,也是Swing中JComponent类父类,
JComponent类是Swing中除了顶层容器外其他组件的父类。Component类为其子类提供了很多功能,包括提供方法setBackGround(),setForeGround(),setFont()等方法设置组件字体、颜色等。所以可以调用具体组件的上述方法进行颜色和字体的设置。
第九章 Applet程序设计
1.Applet的运行过程是怎样的?
Applet的运行包括如下四个步骤:(1)浏览器加载指定URL中的HTML文件;(2)浏览器解析HTML文件;(3)浏览器加载HTML文件中指定的Applet类;(4)浏览器中的Java运行环境运行该Applet。
2.Applet生命周期相关的方法有哪些?这些方法是如何被调用的?
Applet生命周期相关方法包括init(),start(), stop(),destroy()等4种方法。 init()是在装载Applet时被调用,使Applet执行一些基本初始化。start()是在init()方法之后被调用,使Applet成为激活状态。stop()是在浏览器离开含有Applet的网页时被调用,可用该方法暂时停止线程。Destroy()是在浏览器完全关闭之前被调用,彻底终止Applet,从内存卸载并释放该Applet的所有资源。
3.Applet显示或刷新过程中要调用哪些方法?
Applet在初次显示,或运行过程中浏览器窗口大小发生变化而引起Applet的显示发生变化时,将调用Applet的paint()方法进行Applet绘制。当Applet代码需要更新显示内容时,则从程序中调用repaint()方法,则AWT线程在接受到该方法的调用后,将调用Applet的update()方法,而update()方法再调用组件的paint()方法实现显示的更新。
7.JApplet中是否可以添加AWT组件?为什么?
JApplet中一般都使用Swing组件,而不使用AWT组件。因为应避免Swing组件与AWT组件混合使用:在Swing GUI中应该全部使用轻量级组件,避免使用被称为重量级组件的AWT组件。
第十章 线程
1.试述进程与线程之间的关系。
进程是内核级的实体。包含虚存映象、文件指示符,用户ID等。这些结构都在内核空间中,用户程序只有通过系统调用才能访问与改变。线程是用户级的实体,是程序中的单个执行流,线程结构驻留在用户空间中,能够被普通的用户级函数组成的线程库直接访问。寄存器(栈指针,程序计数器)是线程专有的成分。一个进程可以通过运行多个线程来并发地执行多项任务,进程中的所有线程共享该进程的状态。
2.Java中线程的模型由几部分构成?
在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 来请求对象的锁未获得时,也将进入对象锁阻塞状态。该状态下的线程当获得对象锁后,将进入可运行状态。
6.Java中采用什么机制实现多线程的同步?
Java多线程同步采用传统的封锁技术。程序中各个并发线程中对同一个对象进行访问的代码段,称为临界区(Critical Sections)。临界区用“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网络程序设计
1.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()方法,得到java.io.InputStream 类的对象,从该输入流方便地读取URL地址的数据。另一种方式是通过URLConnection类在应用程序与URL之间建立一个连接,通过URLConnection类的对象,对URL所表示的资源进行读、写操作。
3.基于Socket可以实现哪两种通信?简述这两种通信的工作原理。
基于Socket可以实现有连接通信方式和数据报通信方式。 Java的有连接通信采用流式I/O模式。Socket是两个进程间通信链的端点,每个Socket有两个流:一个输入流和一个输出流。只要向Socket的输出流写,一个进程就可以通过网络连接向其它进程发送数据;同样,通过读Socket的输入流,就可以读取传输来的数据。有连接通信一般要经历四个基本步骤:创建Socket,建立连接;打开连接到Socket的输入/输出流;按照一定的协议对Socket进行读/写操作;关闭Socket。
Java在java.net包中提供了两个类: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体系结构如下图所示。
Java 数据库应用
标准SQL语句
JDBC API
JDBC驱动 特定数据库服务器 管理器
JDBC 驱动API
特定数据库的驱动
2. 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是java.sql中的一个接口,它是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()方法使事务回滚。
7. JDBC 2.0与JDBC 3.0中增加了哪些新特性?
JDBC 2.0主要增加了下列功能:在SQL语句执行所返回的结果集中,可以向前或向后滚动记录,并可以定位到指定的记录;利用Java API对数据库表中的数据进行更新;批量更新操作;使用SQL3中的数据类型。
JDBC 3.0在预编译语句、存储过程调用、结果集处理以及所支持的数据类型等方面增加了很多功能,如数据库连接池的操作与配置,事务处理中安全点(Save point)的支持等。
8. JDBC 4.0中增加了哪些新特性?
在JDBC4.0中,提供了更好的代码可管理性和灵活性,并且支持更复杂的数据类型。JDBC4.0新特性或新的增强主要体现在驱动和连接管理、异常处理、数据类型支持以及增加API等方面。
因篇幅问题不能全部显示,请点此查看更多更全内容