一、选择题(每题 2 分,共 30 分)

1. 使用 new 关键字创建对象时,会发生什么?
  • A. 在栈内存中分配空间
  • B. 在堆内存中分配空间并调用构造方法
  • C. 仅调用构造方法不分配空间
  • D. 创建一个静态变量
2. Java 中,子类继承父类使用哪个关键字?
  • A. implements
  • B. extends
  • C. inherit
  • D. super
3. 关于抽象类,以下说法正确的是?
  • A. 抽象类可以被实例化
  • B. 抽象方法必须有方法体
  • C. 子类必须重写父抽象类的所有抽象方法,否则子类也必须是抽象类
  • D. 抽象类不能有构造方法
4. final 关键字修饰类时,表示?
  • A. 该类不能被实例化
  • B. 该类不能被继承
  • C. 该类的对象不能被修改
  • D. 该类的方法不能被调用
5. 定义接口使用的关键字是?
  • A. class
  • B. abstract
  • C. interface
  • D. implements
6. 关于 static 修饰的变量,以下说法错误的是?
  • A. 静态变量属于类,不属于某个对象
  • B. 静态变量被该类的所有实例共享
  • C. 可以通过 类名.变量名 直接访问
  • D. 每个对象都有自己独立的静态变量副本
7. 以下选项中,属于 Java 基本数据类型的是?
  • A. String
  • B. int
  • C. Scanner
  • D. Array
8. 以下关于 try-catch-finally 的说法,正确的是?
  • A. finally 块只有在不抛异常时才执行
  • B. catch 块可以捕获所有类型的异常无需指定类型
  • C. finally 块无论是否发生异常都会执行
  • D. try 块后面必须跟 catch 不能只有 finally
9. 以下代码的输出结果是?
  • A. A
  • B. B
  • C. 编译错误
  • D. 无输出
10. Java 中创建线程的正确方式是?
  • A. 继承 Thread 类,重写 run() 方法
  • B. 继承 Process 类,重写 execute() 方法
  • C. 实现 String 接口,重写 run() 方法
  • D. 调用线程的 run() 方法直接启动新线程
11. 关于 start()run() 方法,正确的是?
  • A. start()run() 完全等价
  • B. run() 启动新线程,start() 在当前线程执行
  • C. start() 启动新线程并调用 run(),直接调用 run() 不会启动新线程
  • D. 一个线程对象可以多次调用 start()
12. 售票程序中出现"同一张票被卖出多次"的问题,根本原因是?
  • A. 线程执行速度太快
  • B. 多个线程同时访问共享数据且没有同步保护
  • C. Thread.sleep() 导致的
  • D. 使用了 Runnable 而非 Thread
13. 关于 String 类,以下说法正确的是?
  • A. String 是可变的字符序列
  • B. 用 "hello" 直接赋值和用 new String("hello") 创建的字符串,== 比较一定为 true
  • C. Stringfinal 类,不能被继承
  • D. Stringreplace() 方法会修改原字符串
14. 以下代码的输出结果是?
  • A. true true
  • B. false true
  • C. true false
  • D. false false
15. 以下哪个方法用于获取字符串的长度?
  • A. size()
  • B. length()
  • C. getSize()
  • D. capacity()

二、填空题(每空 2 分,共 30 分)

1. 使用 ______ 关键字修饰的变量属于类级别,被所有实例共享(如 _static.nation);与之相对,不用该关键字修饰的变量属于 ______ 变量,每个对象独立拥有。
2. 使用 ______ 关键字修饰的类为抽象类;抽象类中的抽象方法使用 ______ 关键字修饰,且没有方法体。
3. Java 中从键盘读取用户输入,通常使用 ______ 类;调用其 ______ 方法读取一行字符串。
4. 接口中的方法默认为 public abstract,实现接口使用 ______ 关键字。
5. Java 异常处理使用 ______ 包裹可能出错的代码,用 ______ 捕获并处理指定类型的异常,用 ______ 执行无论是否出错都必须运行的代码。
6. 创建线程有两种基本方式:继承 ______ 类,或实现 ______ 接口。推荐使用后者,因为可以避免单继承的限制。
7. 使用 ______ 关键字可以给代码块或方法加锁,解决多线程访问共享数据的安全问题。
8. 比较两个字符串的内容是否相等,应使用 ______ 方法;获取字符串长度使用 ______ 方法。

三、简答题(每题 10 分,共 40 分)

1. 什么是抽象类(abstract class)?它和普通类有什么区别?请结合课堂上的 Person 类和 Student 类举例说明抽象类的定义方式、抽象方法的实现,以及为什么抽象类不能被实例化。
2. 简述 Java 的 try-catch-finally 执行流程,并说明 Error 和 Exception 的区别。
3. 请说明 Java 多线程的两种创建方式(继承 Thread 和实现 Runnable),并解释为什么多个线程操作共享数据时需要使用 synchronized 同步。
4. 请解释 String 的不可变性(immutability)是什么,以及 ==equals() 在比较字符串时的区别。