北理工JAVA技术与应用考试试题参考答案及点评
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1. 现代编程语言有两种主要的类型:一种是“编译型 ”的,比如 C ,程序 源码必须经过编译才能运行;另一种是“解释型 ”的,这种类型的语言(比 如早期的 Basic )通常都拥有一个交互环境,用户输入一句代码计算机 就执行一句代码。
Java 属于上述哪种类型?如果你认为 Java 不属于上述任何一种 类型,那么它是不是一种新的编程语言类型?
Jar 则是一个采用 Zip 格式压缩的文件包 ,主要是为了方便 Java 组件 的复用,简化 Java 应用程序的部署和发布。Jar 包中可以保存任意类型的多个 文件和多级嵌套的文件夹。比如 JDK 就包容了不少 Jar 压缩包,你可以使用解压 缩工具(比如 WinRAR)去查看它的内容。可以把 Jar 文件看成是 Java 类库的一个 物理“载体”,之所以称其为“物理”的,是因为我们可以在计算机中直接“看 见”并“操作”它。
try { …… } catch(ClassCastException ex){…… } catch(NumberFormatException ex){…… } catch(Exception ex){ …… } // 此句必须放在最后!
为什么会有这个限制?谈谈你是怎么理解的。 学生们几乎 100% 答对此题,由于 Exception 是顶层类,
由于我在课堂上曾展示过计算机难于精确表示双精度数,比较两个 double 变量是否相等应该检测其差的绝对值是否在某个可以容忍的误差范围 内,所以几个同学就往这个思路上去想了。
对这种情况,我没扣分。 9. 当使用多个 catch 语句捕获多个异常时, Java 规定捕
获 Exception 的 catch 语句必须排在最后,如下所示:
对象间的消息发送最基本的手段就是:一个对象执有另一个对象的引用, 然后,通这个对象引用调用对方的方法,存取对方的字段(或属性)。
对象互发消息,其本质目的就是为了交换信息。
除了上述这两种直接方式之外,我们还可以通过一些第三方的媒价来实 现对象间的信息交换:比如利用类的静态字段,利用内存映射文件,利用数据库, 利用外部共享的“物理”文件等。
要使用嵌套子包中的类,必须再次添加 import 子句 3. J2SE 的功能是 J 2 ME 的一个子集。(错) 4. Java 字节码只有被装入到内存中之后,才能被执行。(对)
在当前计算机体系结构之下,CPU 无法直接读取保存于磁盘上的程序文 件,这些文件所包容的指令必须被装入到内存之后,CPU 才能读取。 5. Swing 是一套 GUI 组件,采用了新的思路设计 Java 应用程序的界面,它完全
北理工 Java 技术与应用考试试题参考 答案及点评
一、判断题(正确的描述打钩,错误的打叉,每题 1 分,共 10 分)
1. 一个 Java 源文件中只能定义一个公有类,并且类名必须与文件名一致。 (对)
2. 通过在程序中引入“ import javax.swing.*; ”语句,就可以使 用 javax.swing 包中的所有类(包括其嵌套的子包中的类)。 (错)
费”大量的内存,这句话是不准确的,因为 Java 有一个垃圾收集机制,在合适 的时机会出来回收不用的 String 对象,因此,这些内存不能说是被“浪费”的, 我们唯一可以说的是:
由于 String 对象是只读的,使用它大量字串连接操作,将导致频繁的内 存分配操作 ,这会严重地影响程序性能。
7. 现有两个长度不同的数组:
放到前面会导致后面的 catch 语句不可能有机会运行。
10. 请看以下示例代码:
String s1 = "Hello"; String s2 = "Hello"; System.out.println(s1 == s2); // 输出: true
String s3 = new String("Hello"); String s4 = new String("Hello"); System.out.println(s3 == s4); // 输出: false
从上述分析可以清晰地看到, s3 与 s4 都引用不同的 对象。所以, s3==s4 返回 fasle 。
这题 100%的学生都能答对,纯粹是送分题。
3. 简述“类(Class)”、“类库(Class Library)”、“包(Package)”、“ Jar 文 件”这四个概念间的联系。
类库其实是一个“统称”,它是类的集合。包则是类库的组织形式,它 类似于 C++中的 namespace,可以解决类的同名问题。
我在《.NET 4.0 面向对象编程漫谈 》的第 14 章《对象间的协作与信 息交换》中介绍了七八种单个、多个对象间消息发送和信息交换的方式,虽然是 用 C#实现的,但其思想完全可用于 Java 中。
掌握这些编程技巧,对开发非常关键。
5. 加法运算符“+”可以施加于原始数值类型(比如 int )的变量,但我们 发现一些对象类型(比如 Integer ) 的变量,也支持“+”运算:
Βιβλιοθήκη Baidu
const #28 = Asciz
Hello;
以下两句代码:
String s1 = "Hello"; String s2 = "Hello";
将生成以下的字节码指令:
0: ldc #2; //String Hello 2: astore_1 3: ldc #2; //String Hello 5: astore_2
6. 在编程时编写过多的注释,会使编译之后生成的程序文件变大。(错)
放心, 编译器会删除所有的注释。所以,哪怕你在程序中写了一部长 篇小说,也不会拖慢程序的运行速度。
7. Java Applet 可运行于浏览器中,这意味着浏览器本身就可以直接执 行 Applet 程序。(错)
浏览器本身只认识 HTML,它对其他类型信息的支持,比如 Flash,Applet, Silverlight 应用程序等都是通过启动本地计算机安装的附加插件来实现的。
Java 源程序需要编译,但运行时需要即时“解释”为本地 CPU 能执行的 机器指令,所以它不属于“纯”的编译型或解释型,而是一种混合类型。
有的同学很“绝”,他说:“Java 是一种面向对象类型的编程语言”。 这句话还真是对的,我也给了分。
2. Java 中有两个关键字: void 和 null ,它们有什么区别?
上面代码首先是调用 Integer.valueOf 方法将整数转换为 Integer 对象, 当两个 Integer 对象相加时,其实是使用 Integer.intValue 方法取出其所“包 装”的整数值,相加之后,再将结果输出。
上述结论是通过分析 javap 反汇编示例代码得到的。
诸如 Java 和 C#之类的编程语言,许多现象已不仅仅是语法问题,编译 器在其中起了很重要的作用。我在课堂上已经介绍过如何使用 javap 去反汇 编.class 文件,通过阅读 Java 编译器生成的字节码指令去弄明白 java 编译器 在后台玩的把戏。
8. 请看以下代码 :
double d1=100.1; double d2=1001/10;
System.out.println(d1==d2); // 输出 : false
明明 d1 与 d2 是相等的 , 为什么程序运行时会输出一个让人意外的结 果 : false ?
很多同学都指出 1001/10 其实是“整除”,得到 100 ,再转为 double , 所以 d2=100.0 ,自然 d1==d2 返回 false 了。
下面来看一下:
String s3 = new String("Hello");
所生成的字节码指令:
// 创建 String 对象,对象引用被 Push 到操作数堆栈( operand stack ) // 常量池的第 5 项指向一个 CONSTANT_Class_info 类型的表项,这个表项将引 用 String 类型 // 在程序运行时,会导致 JVM 装载并连接 String 类型信息 22: new #5; //class java/lang/String 25: dup // 复制对象引用,再次压入操作数堆栈,此复制的对象引用将用于调用构 造函数 26: ldc #2; //String Hello 装载常量“ Hello ” 28: invokespecial #6; //Methodjava/lang/String."<init>":(Ljava/lang/String;)V // 调用 String 类的构造函数,它从操作数堆栈提取信息初始化 String 对象 31: astore_3 // 将创建好的对象引用保存到 s3 中
上面的 #2 代表常量池中的第 2 项:
const #2 = String
#28; // Hello
注意它引用常量池的第 28 项,前面已经看到, 第 28 项就是一个“ Hello ”字符串对象。
astore 指令将常量池中同一个“ Hello ”字符串对象的 地址赋给了 s1 和 s2 ,所以, s1==s2 肯定返回 true 。
地替换掉了原有的 AWT。(错) Swing 仍然使用 AWT 的事件模型,并非完全抛弃。
值得注意的 NetBeans 6.9.1 完成最新的更新组件后,创建 Java 桌面应用程 序时,有了一个新的提示消息框:
看来 Oracle 也知道 Java 在桌面上没戏,干脆放弃了对 Swing 框架的进 一步开发。已经存在这么多年的 Swing 框架被“新主人”抛弃,真不知道该说什 么。
8. JDK 5.0 新增的枚举类型( enum )是一个原始数据类型。(错)
9. Java 中规定所有的方法都必须放到某个类中,不存在独立于类的方法。(对)
10. 面向对象软件系统设计师们经常用到的 UML 是一种编程语言。(错)
二、简答题(请将答案写到答题纸上,注明题号。每题 4 分,共 40 分)
请解释一下为什么上述代码中 “ System.out …” 两句代码输出完全不同 的结果 ?
这里面的关键在于 Java 常量池。 JVM 在装载一 个 .class 文件时,会在内存中创建一个常量池。
“ Hello ”是字符串常量, Java 编译器会将 “ Hello ”放到常量池中,并给它一个索引:
在学习和探索知识的过程中,有的时候就必须注意清晰地分清各个似是 而非的概念,这道题有好几个同学就把这几个概念间的关系弄乱了。
4. 面向对象的程序在运行时会创建多个对象,这些对象之间通常可以相 互 “ 发送消息 ” ,谈谈你对 “ 对象之间发送消息 ” 这句话 的理解,并编写若干句示例代码展示对象之间发送消息的具体编程实现方法。
int[] arr1 = new int[10]; int[] arr2 = new int[100];
那么以下语句能通过编译吗?
arr1 = arr2;
如果你认为可以通过编译,得到这个结论的依据是什么?如果不能通过 编译,你认为其原因是什么?
可以通过编译。此题考核学生知不知道 Java 中的数组属于对 象类型,知不知道对象变量相互赋值的含义。
这道题主要是引导学生学编程语言不要仅学语法,要学会利用工具透过 表面现象看本质。
有的学生猜测 Java 可能是设计了另外的对象负责完成“+”运算,虽然 与 Java 实际情况不符,但这个思路是可行的,我同样给分。
6. 在一个很大的循环(比如循环 10000000 次)中,如果需要进行字串的连接 操作,通常我们者使用 StringBuffer 取代 String ,解释这么做的理由。 绝大部分同学都答对了。但有的同学说:在大循环中使用 String,会“浪
Integer v1 = 100; Integer v2 = 200; System.out.println(v1+v2 ); //输出: 300
这看上去好象 Integer 类型重载了 “ + ” 法运算符,一些编 程语言比如 C ++可以为特定的类重载运算符,但 Java 本身并不支持运算 符重载这一特性。依你的理解或猜测, Java 是采用什么方法让两 个 Integer 对象可以直接“相加”的?
Java 属于上述哪种类型?如果你认为 Java 不属于上述任何一种 类型,那么它是不是一种新的编程语言类型?
Jar 则是一个采用 Zip 格式压缩的文件包 ,主要是为了方便 Java 组件 的复用,简化 Java 应用程序的部署和发布。Jar 包中可以保存任意类型的多个 文件和多级嵌套的文件夹。比如 JDK 就包容了不少 Jar 压缩包,你可以使用解压 缩工具(比如 WinRAR)去查看它的内容。可以把 Jar 文件看成是 Java 类库的一个 物理“载体”,之所以称其为“物理”的,是因为我们可以在计算机中直接“看 见”并“操作”它。
try { …… } catch(ClassCastException ex){…… } catch(NumberFormatException ex){…… } catch(Exception ex){ …… } // 此句必须放在最后!
为什么会有这个限制?谈谈你是怎么理解的。 学生们几乎 100% 答对此题,由于 Exception 是顶层类,
由于我在课堂上曾展示过计算机难于精确表示双精度数,比较两个 double 变量是否相等应该检测其差的绝对值是否在某个可以容忍的误差范围 内,所以几个同学就往这个思路上去想了。
对这种情况,我没扣分。 9. 当使用多个 catch 语句捕获多个异常时, Java 规定捕
获 Exception 的 catch 语句必须排在最后,如下所示:
对象间的消息发送最基本的手段就是:一个对象执有另一个对象的引用, 然后,通这个对象引用调用对方的方法,存取对方的字段(或属性)。
对象互发消息,其本质目的就是为了交换信息。
除了上述这两种直接方式之外,我们还可以通过一些第三方的媒价来实 现对象间的信息交换:比如利用类的静态字段,利用内存映射文件,利用数据库, 利用外部共享的“物理”文件等。
要使用嵌套子包中的类,必须再次添加 import 子句 3. J2SE 的功能是 J 2 ME 的一个子集。(错) 4. Java 字节码只有被装入到内存中之后,才能被执行。(对)
在当前计算机体系结构之下,CPU 无法直接读取保存于磁盘上的程序文 件,这些文件所包容的指令必须被装入到内存之后,CPU 才能读取。 5. Swing 是一套 GUI 组件,采用了新的思路设计 Java 应用程序的界面,它完全
北理工 Java 技术与应用考试试题参考 答案及点评
一、判断题(正确的描述打钩,错误的打叉,每题 1 分,共 10 分)
1. 一个 Java 源文件中只能定义一个公有类,并且类名必须与文件名一致。 (对)
2. 通过在程序中引入“ import javax.swing.*; ”语句,就可以使 用 javax.swing 包中的所有类(包括其嵌套的子包中的类)。 (错)
费”大量的内存,这句话是不准确的,因为 Java 有一个垃圾收集机制,在合适 的时机会出来回收不用的 String 对象,因此,这些内存不能说是被“浪费”的, 我们唯一可以说的是:
由于 String 对象是只读的,使用它大量字串连接操作,将导致频繁的内 存分配操作 ,这会严重地影响程序性能。
7. 现有两个长度不同的数组:
放到前面会导致后面的 catch 语句不可能有机会运行。
10. 请看以下示例代码:
String s1 = "Hello"; String s2 = "Hello"; System.out.println(s1 == s2); // 输出: true
String s3 = new String("Hello"); String s4 = new String("Hello"); System.out.println(s3 == s4); // 输出: false
从上述分析可以清晰地看到, s3 与 s4 都引用不同的 对象。所以, s3==s4 返回 fasle 。
这题 100%的学生都能答对,纯粹是送分题。
3. 简述“类(Class)”、“类库(Class Library)”、“包(Package)”、“ Jar 文 件”这四个概念间的联系。
类库其实是一个“统称”,它是类的集合。包则是类库的组织形式,它 类似于 C++中的 namespace,可以解决类的同名问题。
我在《.NET 4.0 面向对象编程漫谈 》的第 14 章《对象间的协作与信 息交换》中介绍了七八种单个、多个对象间消息发送和信息交换的方式,虽然是 用 C#实现的,但其思想完全可用于 Java 中。
掌握这些编程技巧,对开发非常关键。
5. 加法运算符“+”可以施加于原始数值类型(比如 int )的变量,但我们 发现一些对象类型(比如 Integer ) 的变量,也支持“+”运算:
Βιβλιοθήκη Baidu
const #28 = Asciz
Hello;
以下两句代码:
String s1 = "Hello"; String s2 = "Hello";
将生成以下的字节码指令:
0: ldc #2; //String Hello 2: astore_1 3: ldc #2; //String Hello 5: astore_2
6. 在编程时编写过多的注释,会使编译之后生成的程序文件变大。(错)
放心, 编译器会删除所有的注释。所以,哪怕你在程序中写了一部长 篇小说,也不会拖慢程序的运行速度。
7. Java Applet 可运行于浏览器中,这意味着浏览器本身就可以直接执 行 Applet 程序。(错)
浏览器本身只认识 HTML,它对其他类型信息的支持,比如 Flash,Applet, Silverlight 应用程序等都是通过启动本地计算机安装的附加插件来实现的。
Java 源程序需要编译,但运行时需要即时“解释”为本地 CPU 能执行的 机器指令,所以它不属于“纯”的编译型或解释型,而是一种混合类型。
有的同学很“绝”,他说:“Java 是一种面向对象类型的编程语言”。 这句话还真是对的,我也给了分。
2. Java 中有两个关键字: void 和 null ,它们有什么区别?
上面代码首先是调用 Integer.valueOf 方法将整数转换为 Integer 对象, 当两个 Integer 对象相加时,其实是使用 Integer.intValue 方法取出其所“包 装”的整数值,相加之后,再将结果输出。
上述结论是通过分析 javap 反汇编示例代码得到的。
诸如 Java 和 C#之类的编程语言,许多现象已不仅仅是语法问题,编译 器在其中起了很重要的作用。我在课堂上已经介绍过如何使用 javap 去反汇 编.class 文件,通过阅读 Java 编译器生成的字节码指令去弄明白 java 编译器 在后台玩的把戏。
8. 请看以下代码 :
double d1=100.1; double d2=1001/10;
System.out.println(d1==d2); // 输出 : false
明明 d1 与 d2 是相等的 , 为什么程序运行时会输出一个让人意外的结 果 : false ?
很多同学都指出 1001/10 其实是“整除”,得到 100 ,再转为 double , 所以 d2=100.0 ,自然 d1==d2 返回 false 了。
下面来看一下:
String s3 = new String("Hello");
所生成的字节码指令:
// 创建 String 对象,对象引用被 Push 到操作数堆栈( operand stack ) // 常量池的第 5 项指向一个 CONSTANT_Class_info 类型的表项,这个表项将引 用 String 类型 // 在程序运行时,会导致 JVM 装载并连接 String 类型信息 22: new #5; //class java/lang/String 25: dup // 复制对象引用,再次压入操作数堆栈,此复制的对象引用将用于调用构 造函数 26: ldc #2; //String Hello 装载常量“ Hello ” 28: invokespecial #6; //Methodjava/lang/String."<init>":(Ljava/lang/String;)V // 调用 String 类的构造函数,它从操作数堆栈提取信息初始化 String 对象 31: astore_3 // 将创建好的对象引用保存到 s3 中
上面的 #2 代表常量池中的第 2 项:
const #2 = String
#28; // Hello
注意它引用常量池的第 28 项,前面已经看到, 第 28 项就是一个“ Hello ”字符串对象。
astore 指令将常量池中同一个“ Hello ”字符串对象的 地址赋给了 s1 和 s2 ,所以, s1==s2 肯定返回 true 。
地替换掉了原有的 AWT。(错) Swing 仍然使用 AWT 的事件模型,并非完全抛弃。
值得注意的 NetBeans 6.9.1 完成最新的更新组件后,创建 Java 桌面应用程 序时,有了一个新的提示消息框:
看来 Oracle 也知道 Java 在桌面上没戏,干脆放弃了对 Swing 框架的进 一步开发。已经存在这么多年的 Swing 框架被“新主人”抛弃,真不知道该说什 么。
8. JDK 5.0 新增的枚举类型( enum )是一个原始数据类型。(错)
9. Java 中规定所有的方法都必须放到某个类中,不存在独立于类的方法。(对)
10. 面向对象软件系统设计师们经常用到的 UML 是一种编程语言。(错)
二、简答题(请将答案写到答题纸上,注明题号。每题 4 分,共 40 分)
请解释一下为什么上述代码中 “ System.out …” 两句代码输出完全不同 的结果 ?
这里面的关键在于 Java 常量池。 JVM 在装载一 个 .class 文件时,会在内存中创建一个常量池。
“ Hello ”是字符串常量, Java 编译器会将 “ Hello ”放到常量池中,并给它一个索引:
在学习和探索知识的过程中,有的时候就必须注意清晰地分清各个似是 而非的概念,这道题有好几个同学就把这几个概念间的关系弄乱了。
4. 面向对象的程序在运行时会创建多个对象,这些对象之间通常可以相 互 “ 发送消息 ” ,谈谈你对 “ 对象之间发送消息 ” 这句话 的理解,并编写若干句示例代码展示对象之间发送消息的具体编程实现方法。
int[] arr1 = new int[10]; int[] arr2 = new int[100];
那么以下语句能通过编译吗?
arr1 = arr2;
如果你认为可以通过编译,得到这个结论的依据是什么?如果不能通过 编译,你认为其原因是什么?
可以通过编译。此题考核学生知不知道 Java 中的数组属于对 象类型,知不知道对象变量相互赋值的含义。
这道题主要是引导学生学编程语言不要仅学语法,要学会利用工具透过 表面现象看本质。
有的学生猜测 Java 可能是设计了另外的对象负责完成“+”运算,虽然 与 Java 实际情况不符,但这个思路是可行的,我同样给分。
6. 在一个很大的循环(比如循环 10000000 次)中,如果需要进行字串的连接 操作,通常我们者使用 StringBuffer 取代 String ,解释这么做的理由。 绝大部分同学都答对了。但有的同学说:在大循环中使用 String,会“浪
Integer v1 = 100; Integer v2 = 200; System.out.println(v1+v2 ); //输出: 300
这看上去好象 Integer 类型重载了 “ + ” 法运算符,一些编 程语言比如 C ++可以为特定的类重载运算符,但 Java 本身并不支持运算 符重载这一特性。依你的理解或猜测, Java 是采用什么方法让两 个 Integer 对象可以直接“相加”的?