Java 考试真题卷

第一部分:简答与程序分析题

1. 分析下列程序,简述 Java 对象和基本数据类型作为参数传递时的区别,并给出运行结果。

Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class IntClass {
int value;
}

public class RunIntClass {
public static void modifyValue(int val, IntClass s) {
s.value = val;
val += val;
}

public static void main(String[] args) {
int count = 100;
IntClass a = new IntClass();
System.out.println(a.value); // 打印
modifyValue(count, a); // 方法调用
System.out.println(a.value); // 打印
System.out.println(count); // 打印
}
}

2. 简述 Java 抽象类与接口的共同点,并从属性、成员方法、实现策略方面阐述抽象类与接口的不同点。

3. 假定当前有一个商品订单集合,需要频繁的进行订单的添加和删除操作,你应该选择 Java 集合框架中的 ArrayList 类还是 LinkedList 类来存储这些订单,为什么?请从两者内部实现的数据结构来进行论述。

4. 简述 final 修饰数据成员、方法以及类时各有什么特点。finally 关键字又有什么用途?

5. 请用两种不同的方法定义一个 Java 多线程,让该线程执行 1 到 10000 的整数求和运算,并论述这两定义线程方式的区别。如果该线程类已经继承了某个父类,那么应该使用哪种方法定义该线程?

6. 分析下列程序,其中三个方法能构成方法重载么?为什么?方法重载与方法覆写有什么区别,请在下列程序的基础上给出一个方法覆写的程序示例。

Java

1
2
3
4
5
6
7
8
9
10
11
12
13
class Student {
public double getScore(Double score) {
return score * 0.7;
} // 方法一

private float getScore(Double score) {
return (float) (score.doubleValue() * 0.7);
} // 方法二

private double getScore(double score) {
return score * 0.7;
} // 方法三
}

7. 简述 Java 集合框架中 Map 接口的特点,并简述其两个实现类 HashMap 与 TreeMap 的区别。

8. 已知程序一和程序二的运行结果分别是 “a” 和 “ahello”,根据结果简述 String 与 StringBuilder 的特点及各自的适用场景。

程序一:

Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Str {
public void changePara(String s) {
s = s + "hello";
}
public void invoke() {
String s = "a";
changePara(s);
System.out.println(s);
}
public static void main(String[] str) {
Str s = new Str();
s.invoke();
}
}

程序二:

Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Str {
public void changePara(StringBuilder s) {
s = s.append("hello");
}
public void invoke() {
StringBuilder s = new StringBuilder("a");
changePara(s);
System.out.println(s);
}
public static void main(String[] str) {
Str s = new Str();
s.invoke();
}
}

9. 已知类 SelfException 的某个方法 called() 的方法声明为:static void called() throws SelfException,其中 SelfException 为自定义异常类,继承 Exception 类。假定该类的 main 方法中需要调用 called() 方法,其程序如下:

Java

1
2
3
public static void main(String[] args) {
called();
}

请问该程序会产生什么错误?请给出两种不同的修改方案。

10. 分析下列程序,其中 this.isuper.i 分别是什么含义?该程序是否有错误?若有错误,请指出修改方案;若没有错误,请写出运行结果。

Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Pare {
int i = 7;
Pare(int i) { this.i++; }
}

class Construct extends Pare {
int i;
Construct(int num) {
i = num;
}
int getSuper() { return super.i; }

public static void main(String[] args) {
Construct ct = new Construct(10);
System.out.print(ct.i + ",");
System.out.println(ct.getSuper());
}
}

11. 假设在多线程环境下,线程 1 执行下列程序中某个 Sta 实例对象的 addChar(‘k’) 方法,线程 2 执行同一实例对象的 addChar(‘h’) 方法,那么当前 Sta 对象的 size 和 data 数据成员一定能够得到预期的结果(即依次添加 ‘k’ 和 ‘h’ 两个字符元素)么?如果不能,请分析论述原因,并给出修改方案。

Java

1
2
3
4
5
6
7
8
class Sta {
private int size = 0;
private char[] data = new char[10];

public void addChar(char c) {
data[size++] = c;
}
}

第二部分:编程题

1. 用 Java 语言编写一个复数类 Complex,满足以下条件:

  • (1) 定义 private 的成员变量 realimagin,表示复数的实部和虚部,类型为整数。

  • (2) 定义两个 Complex 的构造方法,一个构造方法不带参数,且 realimagin 的初始值为 0;另一个构造方法有两个参数,参数名为 ri,类型为整数,用这两个参数值分别作为 realimagin 的初始值。

  • (3) 定义一个 sub 方法,其函数原型为 public Complex sub(Complex a),功能为将当前复数对象与形参复数对象相减,返回一个 Complex 类型。

  • (4) 编写 main 方法,测试两个复数 2+3i5+8i 相减的结果,并打印出结果 -3-5i

  • (5) 在 main 方法中,将三个复数 -2+3i, 3-5i, 1+4i 依次存储到 ArrayList 集合对象中,并按照复数实部从大到小的顺序对复数对象进行排序。

    • 提示:可以使用 Collections 类的 public static void sort(List list, Comparator c) 方法进行排序,其中 Comparator 接口的 compare 方法用于指定两个待比较参数的排序。描述如下:

    Java

    1
    2
    int compare(T o1, T o2)
    // Returns: a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second.

2. 已知一个接口 Solid,其包含一个返回图形体积的抽象方法:public double calVol()

  • 定义两个类:正方体类 (Cube) 和 圆柱体类 (Cylinder),两者分别实现接口 Solid,并实现了 calVol() 方法计算各自图形的体积。

  • 定义一个测试类 Test,其包含一个 printVol 方法和一个 main 方法,其中 printVol 方法用于在屏幕输出图形的体积,main 方法的方法体定义如下:

    Java

    1
    2
    3
    4
    5
    Cube cube = new Cube(3.0); // 参数为边长
    Cylinder cylinder = new Cylinder(5.5, 4); // 参数依次为半径和高
    Test test = new Test();
    test.printVol(cube); // 打印 Cube 的体积
    test.printVol(cylinder); // 打印 Cylinder 的体积
    • (1) 要求给出接口 Solid 的定义,以及 Cube 类和 Cylinder 类的完整定义(包括数据成员,构造方法,calVol 方法),并给出 Test 类的 printVol 方法的定义。

    • (2) 现要设计一个 GraphCalcu 类,其不仅提供上述正方体、圆柱体的体积计算,将来还可扩展提供其他实现 Solid 接口的图形体积计算。已知该类的 main 方法定义如下:

      Java

      1
      2
      3
      4
      5
      6
      Cube cube = new Cube(3.0);
      GraphCalcu gc = new GraphCalcu(cube);
      System.out.println(gc.Calcu()); // 提供 Cube 的体积计算
      Cylinder cylinder = new Cylinder(5.5, 4);
      gc = new GraphCalcu(cylinder);
      System.out.println(gc.Calcu()); // 提供 Cylinder 的体积计算

      要求给出 GraphCalcu 类除 main 方法以外的定义(包括数据成员,构造方法,Calcu() 方法)。

3. 编写一个基于 TCP 协议的 Socket 套接字的 Java 服务器程序,满足以下需求:

  • (1) 服务器的主线程一直在本机 8377 端口监听用户的请求,对于每一个用户请求,服务器都会派发一个客户服务线程处理请求。
  • (2) 服务器循环接收来自客户端的字符串消息,并在该消息前面加上客户编号发送给相应的用户。例如,客户 1 发送消息 “Hello” 给服务器,服务器则向客户 1 回复 “Client1, Hello”。
  • (3) 服务器将所有接收到的客户消息保存到本地磁盘 D 的 chat.txt 文件中。
  • (4) 若用户发送的消息内容为 “Bye”,服务器则关闭套接字及连接,结束循环。