实验三 重载和继承的实践
一 、 实验目的
1.掌握Java语言的特点封装继承和多态;
2.掌握方法的重载;
3.掌握继承的实现。
二 、 实验内容
编写一个简单的考试程序,在控制台完成出题、答题的交互。试题(Question)分为单选(SigleChoice)和多选(MultiChoice)两种,其中,单选题和多选题继承试题类。试题间的关系如下所示。实现类及其测试。

三、 程序代码及分步功能解析
java
package A;
//导入工具类
import java.lang.reflect.Array;
import java.util.Arrays; //导入数组工具类,多选判断答案
import java.util.Scanner;//导入扫描器工具 ,用于接收用户在控制台输入的答案
//核心类1 测试基类 Question 父类
public class Question {
//类的属性
String test;//题干
String[] options;//选项
//法1:无参构造
public Question(){}
//法2:有参构造
public Question(String test,String[] options){
this.test=test; //把题干赋值给当前对象的test属性
this.options=options;//同理
}
//法1:检查答案
public boolean checkAnswer(char[] answers){
return false;
}
//法2:打印题目
public void print(){}
}
//核心类2 单选 SingleQuestion 继承
//单选题
class SingleQuestion extends Question{
char answer; //新增属性
//法1:无参
public SingleQuestion(){}
//法2:有参
public SingleQuestion(String test,String[] options,char answer){
super(test,options);//调用父类的有参构造,初始化题干,选项
this.answer=answer; //单独初始化答案
}
//重写父类:检查单选题答案
//逻辑:
//1.确保用户输入答案 answers.length>0
//2.用户输入第一个字符等于正确答案 answers[0]
public boolean checkAnswer(char[] answers){
return answers.length>0 && answers[0]==this.answer;
}
//重写父类:打印单选
public void print(){
System.out.println(test);//打印题干
//循环打印所有选项
for(int i=0;i<options.length;i++){
System.out.println(options[i]+'\t');
}
System.out.println();//换行
}
}
//核心类3 多选 MultiQuestion 继承
//多选题
class MultiQuestion extends Question{
char[] answer; //新增属性
//构造
public MultiQuestion(){}
public MultiQuestion(String test,String[] options,char[] answer){
super(test,options);//调用父类有参构造,初始化
this.answer=answer;//单独初始化答案
}
//重写父类:检查多选题答案
//用Arrays工具类的equals方法,比较"用户输入"与"答案"是否一致
public boolean checkAnswer(char[] answers){
return Arrays.equals(this.answer,answers);
}
//打印多选,同理
public void print(){
System.out.println(test);
for(int i=0;i<options.length;i++){
System.out.println(options[i]+'\t');
}
System.out.println();
}
}
//核心类4:测试类 ExamTest 程序入口,负责运行整个答题流程
//测试类
class ExamTest{
//main方法,Java程序的入口(程序从这开始执行)
public static void main(String[] args){
//创建扫描对象,用于读取用户输入
//处理单选:创建单选对象-打印题目-接收输入-判断答案-输出结果
Scanner scanner=new Scanner(System.in);
//创建单选对象并测试
SingleQuestion singleQ=new SingleQuestion("最早向刘备推荐诸葛亮的是谁?",
new String[]{"A:徐庶","B:司马徽","C:鲁肃","D:关羽"},'B');
singleQ.print();//调用print在控制台显示
System.out.print("请输入单选题答案:");//提示用户输入
//读取用户输入,转化成字符数组
char[] singleAns=scanner.nextLine().toCharArray();
//调用checkAnswer方法,判断答案是否正确
boolean singlePass=singleQ.checkAnswer(singleAns);
//根据判断结果输出提示
if (singlePass){
System.out.println("恭喜,单选题答对了!");
}else {
System.out.println("单选还得努力啊!");
}
//创建多选题对象并测试
//处理多选题,与单选同理,对象不同
MultiQuestion multiAns =new MultiQuestion("三国演义中的三绝是谁?",
new String[]{"A:曹操","B:刘备","C:关羽","D:诸葛亮"},
new char[]{'A','B','C'});//答案,多个,字符组
multiAns.print();
System.out.print("请输入多选答案:");
char[] usermultiAns = scanner.nextLine().toCharArray();
boolean multiPass=multiAns.checkAnswer(usermultiAns);
if (multiPass){
System.out.println("恭喜,多选题答对了!");
}else {
System.out.println("多选还得努力啊!");
}
scanner.close();
}
}
四、程序调试结果(要求截取详细步骤)

五,实验总结
本次实验成功实现了基于继承和多态的考试程序,全面且深入地实践了 Java 面向对象编程的核心概念。实验不仅帮助我巩固了"封装、继承、多态、方法重载"的理论知识,更在实际编码与问题解决的过程中,提升了对面向对象思想的运用能力,为后续更复杂的 Java 编程学习奠定了坚实的基础。