重载和继承的实践
实验三 重载和继承的实践
一、实验目的
1.掌握Java语言的特点封装继承和多态;
2.掌握方法的重载;
3.掌握继承的实现。
二、实验内容
编写一个简单的考试程序,在控制台完成出题、答题的交互。试题(Question)分为单选(SigleChoice)和多选(MultiChoice)两种,其中,单选题和多选题继承试题类。试题间的关系如下所示。实现类及其测试。
三、程序代码及分步功能解析
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 编程学习奠定了坚实的基础。