大学考试:Java简答题

简答题复习题


1、C++为何难以满足嵌入式编程需求,为何说嵌入式编程与网络编程有相似需求?
答:C++编写的程序存在 2 个根本性问题,
(1)编译后文件规模较大,而当时嵌入式芯片存储空间很小;
(2)C++编写的程序难以跨平台运行。z
网络编程与嵌入式编程有着类似需求:追求程序规模小、能跨平台。
具体而言:
(1)当时网速很低,几兆的程序要花费十多分钟才能下载到本地,小程序更有优势。
(2)网络环境中多种软硬件平台共存,跨平台程序有天然的优势。

2、为何说 JAVA 特别适用于嵌入式领域和网络领域的编程?
答:java 的最初设计,就是为了应对嵌入式编程,因此语言设计中充分考虑了嵌入式编程的需求和特点,如跨平台运行、程序小、注重可靠性等;之后的崛起和流行,一方面在于满足网络编程的需求和特色,另一方面,java 进一步拓展了对网络编程的支持,如选用 unicode 字符集、增加 applet 机制和网络编程类库等。因此 java 特别适用于嵌入式领域和网络领域的编程。

3、UNICODE 字符集有哪些编码方式,各有何特色?
答:Unicode 字符集有 UTF-8、UTF-16、UTF-32 等多种编码方式。
其中 UTF-8 是变长编码,即不同的字符采用的编码字节数不同,如对英文,采用单字节编码,对于其它字符,则可能采用 2~4 字节编码;
UTF-32 是定长编码,每个字符固定占用 4 个字节;
UTF-16 采用半定长方式,即采用 2 或 4 个字节编码。为何如此呢?假设有 1024 个英文字符,用 UTF-8 编码只需要 1kb 空间,用 UTF-16 则需要 2kb,用 UTF-32 需要 4kb。
UTF-8 虽更省空间,但编码/解码算法复杂,耗费的时间更多。

4、JAVA 为何选用 UNICODE 字符集?该字符集有何特色?JAVA 采用何种 UNICODE 编码方式?
答:Unicode 是一种大字符集,其最大特色就是包含世界各国文字。这样,可实现在同一程序(或者同一屏幕)中,支持不同文字的显示。之所以这样,是因为 Java 面向网络编程,而网络程序(如网页填写的信息) 可能面临各国文字。为让程序支持各国文字,Java 使用 Unicode 字符集。注:C/C++等采用 ASCII 码作为字符集。
Java 的虚拟机采用 UTF-16 格式,即对基本字符集(约 6 万多字符)用双字节编码,每个字符占 2 个字节;对增补字符集(约一百多万字符)用双字符编码,即每个字符占 4 个字节。(注意:有些资料称 java 有
216(即 65536)个字符是不准确的,java 的基本字符集占两个字节,是指有 216 个码位,并非每个码位都刻画了字符。有些码位起特殊作用。)
Java 字节码(即.class 文件)采用 UTF-8 编码格式,不同字符使用不同长度(分别是 1~4 个字节)的编码,常用字符编码更短,更省空间。

5、简单说明编译器、字节码、虚拟机在 JAVA 实现跨平台过程中起的作用。
答:编译器:与平台有关,即不同平台有不同的编译器,用于将源码翻译成统一的字节码; 字节码:是对源码的统一解释,即字节码只有一种形式,所有平台的字节码格式均相同; 虚虚拟机:与平台相关,基于自身平台的指令系统,解释执行字节码。

6、JAVA 最初设计时,为何十分重视可靠性和安全性,并为此实施了哪些举措?
答:
(1) Java 重视程序的可靠性,首先源于 java 面向的是嵌入式开发。普通程序交付使用后如果发现错误,修改更新即可。嵌入式程序要烧制到芯片中,若烧制后发现错误,只有收回产品,更换芯片,代价极高。其次,90 年代中后期,计算机应用迅速渗透到生活中的各领域,程序中微小的错误可能产生很大影响,如火箭发射失败、银行停止服务、股票交易失常等。(因为容易出错才可靠……)
(2) java 也十分重视程序的安全性。这是因为 java 初期很重视网络程序开发。网络程序的运行,需要用户现将文件下载到本地,之后才能运行。这需要让用户首先相信:既使是不安全的网络程序,下载和运行也不会对用户的本机安全造成影响。
• 可靠性方面的举措,如:语言本身要求强类型、语言简单规范、内存自动管理、垃圾自动回收机制等;
• 安全性方面的举措,如:禁止指针偏移(即引用型只能按名引用)、沙箱机制等。

7、什么是平台无关性,JAVA 是如何跨平台的?
答:平台无关性,又称跨平台性,是指编译后的程序不经修改就可运行于其它平台。
假定要实现在 A 平台编写的程序,到 B 平台运行,步骤为:
(1)先用针对 A 平台的 java 编译器将源码翻译成字节码;
(2)B 平台必须配有针对 B 平台的 java 虚拟机;
(3)运行时,该虚拟机先将字节码翻译成二进制,再交给硬件执行。

8、不同软硬件平台,虚拟机是否相同,为什么?
答:不同平台的虚拟机是不同的。因为:
a) 不同平台的二进制指令可能不同;
b) 虚拟机运行需要本地运行时环境支持。
c) 若强行把不同平台的虚拟机放在一起,虚拟机将十分庞大、复杂,且难于维护。

9、环境变量 PATH 和 CLASSPATH 各有何作用,如何配置?
答:Path 变量用于指明可执行文件(如编译器 javac.exe、解释器 javaexe 等)的位置,以便操作系统(含
Dos 平台)在任何位置都能编译和运行程序(即调用编译器、解释器)。配置就是在 Path 变量添加 JDK 中
bin 目录的位置,该路径包含编译器、解释器等可执行文件。
classpath 变量用于指明要使用或执行的 class 文件的位置,这样 JVM 才能准确找到并加载 class 文件。配置就是在 classPath 中指定 java 通用性类库路径,即 JDK 中 lib 目录的位置。另外,通过手工(而非集成开发环境)调用 java.exe 以执行 java 程序时,还需要用.来指定当前目录,目录之间用英文分号(即;)分隔。

10、简述结构化程序设计方法和面向对象程序设计方法的核心思想。
答:【结构化程序设计方法】将软件系统视为一组功能的集成。“结构化”是指大功能模块由小功能模块组合而成。各模块独立性较强,以便灵活组合出新模块。设计策略为对功能进行自顶向下逐步求精。
【面向对象程序设计方法】将软件系统视为现实世界(需求)的仿真(或模拟)。现实世界由一组对象组成,系统的功能表现为一组对象间的交互。总体设计策略为:从现实世界(需求)中抽象出一组类和对象,编程实现这组类和对象,进而实现对象间的交互(即对象间的消息传递)。

11、简述结构化方法中“结构化”的含义,面向对象程序设计中“面向对象”的含义。
答:结构化:是指将问题求解看成是一组功能模块,大的功能由若干子功能模块组成,各子模块又有一定的独立性。即功能模块的可组合、可拆解;
面向对象:是指将客观世界视为由一组对象组成,功能的发挥(或问题的解决)就是对象之间的互操作。

12、什么是设计的可维护性,简要说明其对软件设计的重要意义。
答:软件的可维护性是指理解、改正、改动、改进软件的难易程度。由于维护活动涉及软件从设计、编码到使用、维护整个过程,且频繁发生。易于维护(即可维护性)的设计,将能有效降低代码的修改难度,减少错误发生的机率,故备受重视;

13、为何说大程序开发的侧重点是可靠性、可维护性和可重用性?
答:a. 由于大程序很难确保完全正确,关系少量的核心模块可靠更为现实;
b. 由于维护活动涉及软件从设计、编码到使用、维护整个过程,且频繁发生。易于维护(即可维护性)的 设计,将能有效降低代码的修改难度,减少错误发生的机率,故备受重视;
c. 模块易于重用,不仅可减少开发工作量,而且重用的模块往往更可靠。

14、假定期望设计一个类 A,类中包含一个必须要拥有 PUBLIC 属性的方法 F()。当不希望其他程序员重写此方法时,请举出三种处理策略?
答:a. 给 f()方法施加 static 修饰;
b. 给 f()方法施加 final 修饰;
c. 将类 A 设定为 final 类。

15、简述静态变量与实例变量的区别,静态方法和实例方法的区别?
答:静态变量存于所属类的方法区(即类定义中),故被该类的所有对象共享;实例变量存于对象中,不同对象的实例变量可以相同,也可以不同。静态方法和实例方法都存于所属类的方法区,但静态方法即可通过类名调用,也可通过对象调用,而实例方法只能通过对象调用。

16、简单说明 JAVA 的异常处理策略。
答:java 将程序运行期间的所有异常均打包成异常对象,异常处理就是对该异常对象的捕获和处理。处理机制包括声明原则和处理原则,前者是指声明自己将抛出何种异常,即当异常发生时,自己不处理,将异常对象交给调用者;而处理原则是指用 try-catch 语句对异常对象的捕获并处理。
17、简述什么是检查型(也称程序型)异常,什么是非检查型(也称虚拟机型)异常,二者在使用上有何区别?
答:程序性异常是指必须在虚拟机监控态才能创建并抛出的异常;虚拟机异常是指在虚拟机正常状态下能够创建并抛出的异常。
当某个类的使用可能引发程序性异常时,使用该类之处必须用 try-catch 处理;或是将包含该处使用的方法进行声明。虚拟机异常则无此类要求。

18、简述线程三要素及其各自主要作用。
答:线程三要素为:
a. 虚拟 CPU:即 Thread 类,该类涉及线程对象自身的所有基本属性和行为,以及线程的调度和管理机制。若把线程对象看做是一台虚拟的计算机,该类就是其中 CPU。
b. 线程体:Runnable 中的 run 方法,只有重写该接口中的 run()方法,才能成为线程体。
c. 共享资源:可被多个线程访问的资源,如共同存取的对象、硬件(如显示器)等。线程间正是有了共享资源,才能发生关系,才有存在的价值。

19、给定线程 T 定义如下:
class T extends Thread { private int data; public T(int d){data=d;}
public void run(){
for(int i=1; i<20; i++)System.out.print(data*i+ " ");
}
public static void main (String[] args) {
T t2=new T(2); T t3=new T(3); T t5=new T(5); t2.start();t3.start();t5.start();
}
}
下面是某次输出的结果:
2 4 6 8 5 3 6 9 10 15 10 12 14 16 20 25 12 15 30 35 18 20 40 45 18 50 55 60 65 70 75 80 85 90 95 22 24 26
28 30 32 21 24 27 30 34 36 33 38 36 39 42 45 48 51 54 57
请指出第一、第二个 30 分别由哪个线程输出,为什么?
答:由于单个线程按顺序输出,因此第一个 30 由 t5 输出,因为 30 前已经输出了 25,尚未输出 28/27,故不可能是 t2/t3。第二个 30 由 t2 输出。因为第二个 30 前刚输出了 28,而 t5 已输出 30、尚未输出 27,故只能是 t2。

20、什么是临界区,什么是临界资源,各有何作用。
答:synchronized(D){ S }中,D 是临界资源,S 是临界区。此语法框架实现了:临界区 S 只能以原子方式访问临界资源 D,从而让多个线程对临界资源的访问更加安全、规范。

21、简述互斥和同步主要用于解决何种问题。
答:互斥,旨在实现多个线程能够安全规范地对同一数据资源实施访问; 同步,旨在实现多个线程间并发次序保持特定的节奏。

22、简述应用委托事件处理模型的基本步骤
答:基本步骤为:(1)确定事件源,并基于事件源确定事件对应的监听器接口;(2)b. 让事件处理者实现监听器接口,特别是相关处理方法;(3)关联事件源和事件处理者。

23、对象间的数据交互常用 GET/SET 方法,为何又需要引入 IO 流机制?
答:get/set 方法只适合于对象间简单直接的数据存取。当对象分处网络两端,或涉及外存、或对象间需要持续、大规模的数据传输,或是对象间的数据交互机制涉及到线程同步等复杂关系时,就需要 IO 流机制的支持。java 的 IO 流机制及相关类库为上述情况下的数据交互提供统一交互策略,并保障交互数据的正确性和完整性,提高传输效率。

24、简述 IO 机制的核心思想、处理策略及其优点
答:流是对象间数据交互的统一形式。流是单向的,输入流配备读操作(即只能读);输出流配备写操作(即只能写)。应用策略类似生产流水线,即按需组合。这样,在使用流时,无需关心数据交互的另一端是什么对象,或是在什么位置,只需根据需要从流中读取或向流写入即可。
25、什么是序列化和反序列化,并以借助文件 TREE.DAT 读写 TREE 型对象 T 为例,说明这两种机制如何使用.
答:序列化,就是将对象写入对象流;反序列化,就是从对象流中提取所需对象。 例如,需要将一棵树 t 写入文件时,需要使用序列化机制,方式为:
ObjectOutputStream obj_o=ObjectOutputStream( new FileOutputStream(“tree.dat”) ); obj_o.writeObject(a);
当通过文件还原树时,需要使用反序列化机制,方式为: ObjectInputStream obj_o=ObjectInputStream( new FileInputStream(“tree.dat”) ); Tree t=(Tree)obj_o.readObject(a);
另外,Tree 及与 Tree 直接或间接相关的类必须实现 Serializable 接口。

26、借助反序列化机制产生的对象与用 NEW 创建的对象有何区别?
答:反序列化机制产生的对象,实际上是以前存在的对象(即对象中的数据可以不是默认值,是“旧”对象);而用 new 创建的对象,各属性的值要么是通过构造函数赋的值,要么是默认值,即“全新”的对象。

存储机理绘图
(1) 下面语句完成了二维数组的创建及初始化String[][] s=new String[][]{ new String[3],{“aaa”,“bbb”} }; 画出 s 及其引用对象在堆、栈内存中的存储示意图。
在这里插入图片描述

评分标准:能区分栈空间和堆空间得【3 分】,画出二维数组得【3 分】,画出 s[1]指向的数组得【2 分】,画出 s[1][0]、s[1][1]指向的对象得【2 分】。

(2) 给定如下类
class T{ static int x; int[] y=new int [3]; T(int a){ x=a; } void f(){;} }
依次执行下列三条语句 :T a=new T(5); T b=new T(6); T c=new T(7);
请画出相关数据在栈、堆、方法区中的内存示意图
在这里插入图片描述

评分标准:分出栈空间、堆空间、方法区,得【5 分】(少一个扣 2 分直至扣完 5 分);写出 x=7,得【2 分】;画出 a/b/c 及对应的对象得【2 分】,对象中有默认值得【1 分】

posted @ 2021-01-09 11:23  Zeker62  阅读(240)  评论(0编辑  收藏  举报