1、中国石油大学(北京)远程教育学院期 末 考 试 Java语言程序设计 学习中心:_ _ 姓名:_ 学号:_ 关于课程考试违规作弊的说明1、提交文件中涉嫌抄袭内容(包括抄袭网上、书籍、报刊杂志及其他已有论文),带有明显外校标记,不符合学院要求或学生本人情况,或存在查明出处的内容或其他可疑字样者,判为抄袭,成绩为“0”。 2、两人或两人以上答题内容或用语有50%以上相同者判为雷同,成绩为“0”。3、所提交试卷或材料没有对老师题目进行作答或提交内容与该课程要求完全不一、题型 简答题,4题,每题15分,共60分;编程题,2题,每题20分,共40分二、题目共两套题,学号末尾数单号学生做第一套,学号末尾数
2、双号学生做第二套题第一套题一、简答题1 什么是多态性? 方法的重载和覆盖有何区别? 阅读下列代码,指出其中存在的重载和覆盖, 写出输出结果是什么?解释为什么这样输出? (15分)class C1 public void f() System.out.println(C1.f);class C2 extends C1public void f() System.out.println(C2.f); class C3 public void g(C1 one) System.out.println(g(C1);one.f();public void g(C2 two) System.out.pri
3、ntln(g(C2);two.f();public class Main1 public static void main(String args) C1 one = new C2();C3 three = new C3();three.g(one);答:1.多态性是指允许不同类的对象对统一消息做出响应。多态包括参数化多态和包含多态。多态性语言具有灵活、抽象、行为共享、代码共享等优势,很好地解决了应用程序函数同名问题。重载是指同一个类中有多个同名的方法,但这些方法有着不同的参数,因此在编译时就可以确定到底调用哪个方法,它是一种编译时多态。覆盖是指子类可以覆盖父类的方法,同样的方法会在子类和父类
4、中有着不同的变现形式。即重载是一个类的多态性表现,而覆盖是子类和父类的一种多态性表现。classC1publicvoidf() System.out.println(C1.f); classC2extendsC1publicvoidf() System.out.println(C2.f);/覆盖,子类C2重写了父类C1中的f()方法 classC3 publicvoidg(C1one) System.out.println(g(C1);one.f(); publicvoidg(C2two) /重载,根据传入参数不同,C3实现不同的g()方法 System.out.println(g(C2);t
5、wo.f(); publicclassMain1publicstaticvoidmain(Stringargs) C1one=newC2(); C3three=newC3();three.g(one); 输出:g(C1)C2.f原因:由于子类C2的f()方法与父类C1的方法同名,因此C2的方法会覆盖C1的方法。在执行C1 one = new C2()语句时,会调用C1类的构造函数,因此three.g(one)语句会调用传入参数为C1的g()方法,输出g(C1)。而由于实际创建的是C2类的方法,后面的方法调用都会调用子类C2的方法,因此输出C2.f。2、请用自己的语言介绍throw/throws
6、有什么联系和区别?在程序中应如何使用?另外谈谈final、finally的区别和作用,必须举例说明用法。(15分)答:若某个方法可能会发生异常,但不想在当前方法中处理这个异常,则可以使用throws、throw关键字在方法中抛出异常。throw关键字通常用于方法体中,并且抛出一个异常对象,程序在执行到throw语句时立即终止,它后面的语句都不执行。throws关键字通常被应用在声明方法时,用来指定方法可能抛出的异常,多个异常可以使用逗号分隔,使用throws关键字将异常抛给上一级后,如果不想处理该异常,可以继续向上抛出,但最终要有能够处理该异常的代码。/*在类Main中创建pop()方法,在该
7、方法中抛出Exception异常,在主方法中调用该方法,并实现异常处理*/publicclassMain /创建类staticvoidpop()throwsException /定义方法并抛出异常inta=1/0;/除数为0 publicstaticvoidmain(Stringargs) /主方法trypop();/调用pop()方法 catch(Exceptione) System.out.println(pop()方法抛出的异常);/输出异常信息 /*使用throw关键字直接在程序中抛出异常*/publicclassMain publicstaticvoidmain(Stringargs
8、) inta= 1;if(a=1) thrownewNumberFormatException(); else System.out.println(a); final用于声明属性、方法和类,分别表示属性不可变、方法不可覆盖和类不可被继承。Finally作为异常处理的一部分,只能用在try/catch语句中,并且附带一个语句块,表示这段语句最终一定被执行。/*类Main被声明为final,所以不能被继承,所有方法都不能被重写。* finally中的代码一定会被执行,即使程序被return中。*/publicfinalclassMain publicstaticvoidmain(Stringar
9、gs) Mainm=newMain();trythrownewNullPointerException(); catch(NullPointerExceptione) System.out.println(程序抛出了异常); finally System.out.println(执行了finally语句块); 3、编写一个描述学生基本情况的类,属性包括姓名,学号,语文成绩,数学成绩和英语成绩,方法包括信息输出,设置姓名和学号,设置三门课程成绩,计算总成绩和平均成绩。在main方法中对方法进行测试(15分)答:publicclass MainprivateStringnumber,name;pr
10、ivatedoubleChinese,Math,English;publicMain(Stringa,Stringb,doublec,doubled,doublee)/有参构造函数number=a;name=b;Chinese=c;Math=d;English=e; publicvoidsetName(Stringname)/设置姓名this.name=name; publicvoidsetNumber(Stringnum)/设置学号this.number=num; publicvoidsetChinese(doublescore)/设置语文成绩this.Chinese=score; publ
11、icvoidsetMath(doublescore)/设置数学成绩this.Math=score; publicvoidsetEnglish(doublescore)/设置英语成绩this.English=score; publicString getNumber()/获取学号returnnumber; publicString getName()returnname; publicdoublegetChinese()returnChinese; publicdoublegetMath()returnMath; publicdoublegetEnglish()returnEnglish; pu
12、blicdoublegetSum()/计算总成绩returngetChinese()+getMath()+getEnglish(); publicdoublegetAverage()/计算平均成绩returngetSum()/3; publicvoidshow()/信息输出 System.out.println(姓名:+getName(); System.out.println(学号:+getNumber(); System.out.println(语文成绩:+getChinese(); System.out.println(语文成绩:+getMath(); System.out.printl
13、n(语文成绩:+getEnglish(); publicstaticvoidmain(Stringargs) Mains1=newMain(12213,sname,85,82,98);/调用有参构造函数初始化s1.setChinese(95);/设置语文成绩s1.show();/输出所有信息 System.out.println(总成绩:+s1.getSum()+平均分:+String.format(%.2f,s1.getAverage();/平均分结果保留两位小数 4、Java中实现多线程有几种方式?这几种方式有什么区别?然后采取其中一种方式设计一个线程例子,在例子中构造4个线程对象实现对同
14、一数据类对象进行操作(数据初始值为0),其中线程对象1对数据执行+10的操作,线程对象2对数据执行+20的操作, 对象3对数据执行乘以3的操作,线程对象4对数据执行除以4的操作,,要求考虑线程同步,保证数据操作的正确性。要求提供程序代码以及运行结果截图(15分)答:四种方式: 继承Thread类,重写其中的run方法,最后调用其start方法,开启新的线程来执行重写的run方法。实现Runnable接口实现里面的run方法,将该实现类的对象传入Thread中,调用Thread的start方法,开启新的线程来执行Runnable接口实现类的run方法。实现Callable接口实现里面的call方
15、法,将该实现类的对象传入FutureTask对象中,再将FutureTask对象传入Thread中,调用Thread的start方法,开启新的线程来执行Callable接口实现类的call方法。Future接口实现类对象=ExecutorService接口实现类对象即线程池对象.submit(Callable接口实现类对象),以上使用线程池来实现多线程。四种方式的区别: 相比于继承Thread类,实现Runnable接口,Callable可以避免Java单继承带来的局限性;Runnable,Callable接口的实现类可以被多个线程共享,实现了代码的复用。继承Thread类和实现Runnabl
16、e方法都是实现run方法,没有返回值,而另外两种都要实现Callable接口的call方法,有返回值。二、编程题1、编写一个图形用户界面程序,包含两个按钮,一个信息标签(label)和一个显示面板,两个按钮分别为“掷色子”和“移动”,在显示面板中显示一个小人(用小圆以及线绘制),随机设定小人的初始位置,当点击“掷色子”按钮,随机产生移动信息(上移,下移,左移,右移,移动几步),并显示在信息标签中,点击移动,按照产生的移动信息,让小人进行移动。要求提供完整程序代码以及运行结果截图(20分)答:import java.awt.*;import javax.swing.*;public class
17、Jxxk extends JFrameprivate JTabbedPane tabbedPane;private JLabel label1,label2,label3;private JPanel panel1,panel2,panel3; public Jxxk()super(选项卡窗口); setSize(400,300); Container c = getContentPane();tabbedPane=new JTabbedPane();/创建选项卡面板对象/创建标签label1=new JLabel(第一个标签的面板,SwingConstants.CENTER);label2=
18、new JLabel(第二个标签的面板,SwingConstants.CENTER);label3=new JLabel(第三个标签的面板,SwingConstants.CENTER);/创建面板panel1=new JPanel();panel2=new JPanel();panel3=new JPanel(); panel1.add(label1);panel2.add(label2);panel3.add(label3); panel1.setBackground(Color.yellow);panel2.setBackground(Color.blue);panel3.setBackg
19、round(Color.green);/将标签面板加入到选项卡面板对象上tabbedPane.addTab(标签1,null,panel1,First panel);tabbedPane.addTab(标签2,null,panel2,Second panel);tabbedPane.addTab(标签3,null,panel3,Third panel); c.add(tabbedPane);c.setBackground(Color.white); setVisible(true);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);public st
20、atic void main(String args)Jxxk d = new Jxxk();2、编写一个班级推优(优秀学生干部)投票管理程序。列出参与推优的学生名单(6名),可以勾选进行投票,要求每个参选学生前面有图标表示候选人的职务,每人可以投3票,每次投票后能够显示当前投票人数以及每名候选者得票数,图形化柱状图显示得票数,可以保存投票结果到文本文件。要求提供完整程序代码以及运行结果截图(20分)答:public class VoteOperate private Person per = new Person(小张,001,0),new Person(小王,002,0), new Per
21、son(小夏,003,0),new Person(丁丁,004,0),new Person(刘强,005,0),new Person(小赵,006,0);private InputData input ;private boolean flag = true;private int sum;private int errorVote;public VoteOperate() this.input = new InputData(); while(flag) +sum; this.voteForCandidate(); this.printInfo(); this.getResulet();pu
22、blic class VoteOperate private Person per = new Person(小张,001,0),new Person(小王,002,0), new Person(小夏,003,0), new Person(丁丁,004,0),new Person(刘强,005,0),new Person(小赵,006,0); private InputData input ; private boolean flag = true; private int sum; private int errorVote; public VoteOperate() this.input = new InputData(); while(flag) +sum; this.voteForCandidate(); this.printInfo(); this.getResulet();