Java面向对象模拟试题1
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、判断题(正确的描述打钩,错误的打叉,每题1分,共10分)
1 抽象类中不可以有非抽象的方法。
(错)
2 如果将一个对象强制类型转换为一个不兼容的类型,将引发NullPointerException
异常。
(错)
3 Java中Object类是最顶层的类。
(对)
4 程序在编译通过以后,仍然可能出现运行时错误和逻辑错误。
(对)
5 可以通过javac来运行一个Java Application。
(错)
6 可以在子类构造函数中通过this关键字调用基类的构造函数。
(错)
7 Java语言是IBM公司设计的一种面向对象程序设计语言。
(错)
8 一个Unicode字符占4个字节。
(错)
9 在循环语句中,使用continue;语句可以跳出循环。
(错)
10 在Java Application中如果没有定义main()方法,则程序不能编译。
(错)
二、简答题(请将答案写到答题纸上,注明题号。
每题3分,共30分)
1 请看以下代码:
package mytest;
public class Main {
public static void main(String[] args) {
System.out.println(new A());
}
}
class A
{
}
Java在运行上述代码时输出一个很奇异的结果:
mytest.A@60aeb0
尝试解释一下可能的原因.
点评:
本题的关键在于虽然类A没有定义任何方法,但它隐含着从基类Object中继承了toString()方法。
答案必须点出这一结果是执行toString()方法得到的。
2 什么叫多态?你是如何理解多态的?请设计一个简单的示例,展示多态的用法。
点评:
几乎所有的Java教材都要介绍多态的概念,但只有能用自己的语言说清楚,并能自己设计一个典型实例展示多态特性的,才算是真正弄明白了。
从试卷中发现,不少同学弄混了方法重载与方法覆盖,认为“方法重载”就是多态。
3 在Java GUI程序中,布局管理器是一个很重要的概念。
谈谈你对这个概念的理解,并进而回答以下问题:
如果要你开发出一个Windows资源管理器(图 1),你将如何应用合适的“布局管理器”来实现其界面?
图 1 Windows 7中的资源管理器
请指明你在图 1中的哪部分应用哪种布局管理器。
4 int和Integer都可以代表一个整数,这两者在使用上有什么区别吗?为什么JDK中要设计两个数据类型来表示同一种数据?
5 Java Application的程序入口点为main()函数,其声明如下:
public static void main (String[] args)
请解释一下为何main()函数是公有的和静态的?
6 抽象类与接口都不能直接用来创建对象,那么,这两者什么用?彼此之间又有何区别?
你认为在哪种场合应该用抽象类,哪种场合应该用接口?在JDK中你能找到相应的实例吗?如果能找得到,请分析一下JDK的设计者为何将它们设计为“抽象类(或接口)”。
7 如何判断函数构成重载关系?挑出以下函数中不构成重载关系的函数,指明它违反了哪个判断准则。
(1)void myFunc();
(2)int myFunc(int x,int y);
(3)int myFunc(string str, string str2);
(4)string myFunc(int x, int y);
另外,你还记得JDK中有哪个类拥有重载的方法吗?列举一两个。
8 Swing和AWT都可以用于设计GUI(图形用户界面)程序,这两者有何区别?
你还用过其他的编程语言或开发工具设计GUI程序吗?如果让它们与Java 进行对比,你觉得使用Java设计GUI程序的优点在哪,缺点在哪?
9 在面向对象程序中,实现代码复用主要有两种方式:继承和组合。
请设计两段示例代码,分别展示出Java实现这两种方式的代码框架。
如果在某个实际开发场景中这两种方式都可用,你认为应该优先选择哪一种?原因?
10 各种类型的几何图形都有自己的面积计算公式,但在一个CAD(计算机辅助设计)软件中,图形的种类非常多,如果程序需要计算出任何一种图形的面积,最简单的想法是使用条件判断语句根据图形类型来选择相应的计算公式。
然而,这种方法不太好,可能会导致嵌套层次很深的条件判断语句。
另外,如果软件要扩充功能以支持新的图形种类,则又不得不修改调用不同公式计算图形面积的代码。
在学习了面向对象技术之后,你能对上述问题给出一个较好解决方案来吗?
请以计算圆形、矩形和三角形三种几何图形的面积为例,列出关键代码或者绘出UML图来展示你的方案。
三阅读程序题(每题3分,共12分)
说明:
请仔细阅读左栏的程序代码,将程序运行结果写在“运行结果”一栏。
程序一
public class Test {
public static void main (String[] args) {
String s1=new String("Hello");
String s2="Hello";
String s3="Hello";
System.out.println(s1==s2);
System.out.println(s1.equals(s2));
System.out.println(s2==s3);
System.out.println(s2.equals(s3));
String s4=s1;
System.out.println(s1==s4);
System.out.println(s1.equals(s4));
}
}
运行结果
false
true
true
true
true
true
程序二
public class Test {
private static void printArray(int[] arr) {
for(int i=0;i< arr.length;i++)
System.out.print(arr[i]+",");
System.out.println("\n");
}
private static void changeValue(int value) {
value*=2;
}
private static void changeValue(int[] arr) {
for(int i=0;i<arr.length;i++)
arr[i]*=2;
}
public static void main (String[] args) {
int[] arr={1,2,3,4,5};
changeValue(arr[0]);
printArray(arr);
changeValue(arr);
printArray(arr);
}
}
运行结果
1,2,3,4,5,
2,4,6,8,10,
程序三
class MyException extends Exception {
public MyException(String message) {
super(message);
}
}
public class Test {
private static void fun1() throws MyException {
throw new MyException("An MyException object is thrown in fun1().");
}
private static void fun2() throws MyException {
try {
fun1();
}
catch(NullPointerException ex) {
System.out.println("NullPointerExcepti on:"+ex.getMessage());
}
finally {
System.out.println("Go through finally code in fun2().");
}
}
public static void main (String[] args) {
try {
fun2();
}
catch(MyException ex) {
System.out.println("MyException:"+ex.get Message());
}
catch(Exception ex) {
System.out.println("Exception:"+ex.getMessage( ));
}
}
}
运行结果
Go through finally code in fun2().
catch MyException object. Message:An MyException object is thrown in fun1().
四、程序改错题(每题3分,共12分)
说明:
下述程序中都包含着错误而不能通过编译。
请在右栏指出程序错误的原因(可指明行号),并修改程序使其可以通过编译。
程序一
1 public class Main {
2 public static final A Aobj=null;
3 public static void main(String[] args) {
4 Aobj=new A();
5 }
6 }
7 class A{
8 }
更正
(1)去掉final
(2)
去掉main()函数中的赋值语句,定义语句改为:
public static final A Aobj=new A();
程序二
01 public class Test {
02 public static void main(String[] args) {
03 MyClass obj=new MyClass();
04 +=",World!";
05 System.out.println();
06 }
07 }
08 class MyClass {
09 public String Info="Hello";
10 public MyClass(String Info)
11 {
12 =Info;
13 }
14 }
更正
尝试调用默认构造函数。
但在用户指定了一个构造函数之后,不再允许直接调用默认构造函数。
更正:
Test obj=new Test("Hello");
程序三
01 abstract class Animal {
02 public abstract void saySomething() {
03 System.out.println("你想说什么就说吧!");
04 }
05 }
06 class Dog extends Animal {
07 public void saySomething() {
08 System.out.println("我现在有了第二职业:捉耗子!");
09 }
10 }
11 public class Test {
12 public static void main (String[] args) {
13 Animal ani=new Dog();
14 ani.saySomething();
15 }
16 }
更正
03句去掉abstract。
或者去掉Animal类saySomething方法中的所有实现代码。
六编程题(共36分)
说明:
(1)编程题共分为两组:简单编程题与综合编程题。
简单编程题不要求写出完整的可运行的程序。
综合编程题要求写出的程序必须是可以通过编译的完整的程序。
(2)请在试卷后所附的答题纸上书写程序代码,注明题号。
(3)代码要书写规范,卷面整洁。
点评:
1 简单编程题(每题4分,共20分)
(1)编写代码生成10个位于[50,100]区间的整数。
点评:我本意是要求学生生成随机数,但题目没有强调是随机数,所以,这道题简直就是送分题,难度大大降低。
(2)编写一个方法,接收一个整数数组作为参数,此方法会找出其最大值、最小值和平均值。
要求使用递归方法实现。
点评:这道题看上去简单,但其实难度不小。
问题的关键在于如何在方法的递归调用中暂存数据。
这有两种方式实现:
第1种是将最大值、最小值和平均值作为类的字段,而将求值的递归函数作为类中的方法,在方法的每次递归调用中直接修改类中的相应字段。
第2种是创建一个新类,为其设计几个字段来代表最大值、最小值、总和,再提供一个公有方法用于得到平均值,然后将其作为递归函数的一个参数传送。
本题设计时应该将“平均值”改为求“数组元素的总和”,这样可以大大降低本题的难度,这是我设计试题时失误的地方。
(3)如果你设计的一个类只允许创建一个实例,你会如何设计它?写出类的框架代码。
如果希望你设计的类最多只能创建3个实例,你又该如何修改你的代码?
再扩充一下:
如果要求你设计一个类,在程序运行时才决定它最多能创建的实例个数,你打算如何设计它?
点评:
(4)为了按内容来比较属于同一类型的两个对象的“大小”,JDK中定义了一个Comparable接口用于供程序员自定义两个对象的比较规则,此接口声明如下:
public interface Comparable
{
int compareTo(Object other);
}
实现了此接口的两个对象(不妨称之为X和Y)可以相互比较:两对象X和Y相等,compareTo()方法返回0,X小于Y时compareTo()方法返回一个负数(通常设为-1),X大于Y时返回正数(通常设为1)。
请编写一个方法,接收一个Comparable对象数组作为参数,然后,此方法对此数组中的对象进行升序排列。
(5)从1到100的100个整数,以某种随机的方式进行排列,然将它们挨个放到一个整数数组中,此数组只能容纳99个整数,因此,必定会有一个整数会丢弃。
编写一个函数,接收一个包容99个整数的数组作为参数,找出被丢弃的哪个整数。
另外,你如何保证此函数接收的数组满足以下预设的条件?
1)数组包容99个整数
2)数组中的整数均在[1,100]的范围之内
3)数组中不包含两个相同的整数
如果函数接收到的数据不满足上述要求,你打算如何处理?写出你的处理策略。
点评:
这道题其实来自于软件公司的面试题。
大多数同学都能顺利地回答第一问,虽然算法不优化。
第2问其实是了解一下学生是否知道如何实施“防卫型”编码,仅有少数学生给出了可行的实现方案。
2 综合编程题(16分)
以下为一棵有序二叉树:
图 2
请用Java实现上述数据结构,并编写一个函数按前序方式遍历此树的所有节点。
说明:
(1)程序必须为完整的可编译运行的Java Application。
(2)假设树中每个节点中都保存着一个整数,代表此节点所保存的数据。
(3)所谓前序遍历,是指从树的根节点开始,先输出根节点保存的数据,然后输出左子树根节点保存的数据,再输出右子树根节点保存的数据,由此不断递归,当访问完树中的所有节点时,遍历完成。
(4)在main()函数中编写示例代码创建上图中的二叉树,调用写好的函数,输出前序遍历结果:1,2,3,4,5
(5)请遵循Java软件工程师的代码开发规范:在你写的代码中加上注释,并注意变量和类的名字要望名知义,必要的缩进和空行等,让你的代码规范易读。
评分标准:
(1)能以面向对象的思想用Java实现“二叉有序树”这一数据结构(6分)(2)能编写出前序遍历树的函数(6分)
(3)在main()中能写出示例代码完成所要求的工作:创建树和输出遍历结果(4分)
(注:可编辑下载,若有不当之处,请指正,谢谢!)。