《Java语言程序设计》答案Word文档格式.docx
《《Java语言程序设计》答案Word文档格式.docx》由会员分享,可在线阅读,更多相关《《Java语言程序设计》答案Word文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
}
}
classC2extendsC1
C2.f"
}
classC3{
publicvoidg(C1one){
g(C1)"
one.f();
publicvoidg(C2two){
g(C2)"
two.f();
publicclassMain1
publicstaticvoidmain(String[]args){
C1one=newC2();
C3three=newC3();
three.g(one);
答:
1.多态性是指允许不同类的对象对统一消息做出响应。
多态包括参数化多态和包含多态。
多态性语言具有灵活、抽象、行为共享、代码共享等优势,很好地解决了应用程序函数同名问题。
重载是指同一个类中有多个同名的方法,但这些方法有着不同的参数,因此在编译时就可以确定到底调用哪个方法,它是一种编译时多态。
覆盖是指子类可以覆盖父类的方法,同样的方法会在子类和父类中有着不同的变现形式。
即重载是一个类的多态性表现,而覆盖是子类和父类的一种多态性表现。
class
C1
publicvoid
f(){
System.out.println("
C2
extends
//覆盖,子类C2重写了父类C1中的f()方法
}
C3{
g(C1
one){
one.f();
g(C2
two){//重载,根据传入参数不同,C3实现不同的g()方法
two.f();
publicclass
Main1
publicstaticvoid
main(String[]
args){
C1
one
=
new
C2();
C3
three
C3();
three.g(one);
输出:
g(C1)
C2.f
原因:
由于子类C2的f()方法与父类C1的方法同名,因此C2的方法会覆盖C1的方法。
在执行C1one=newC2()语句时,会调用C1类的构造函数,因此three.g(one)语句会调用传入参数为C1的g()方法,输出g(C1)。
而由于实际创建的是C2类的方法,后面的方法调用都会调用子类C2的方法,因此输出C2.f。
2、请用自己的语言介绍throw/throws有什么联系和区别?
在程序中应如何使用?
另外谈谈final、finally的区别和作用,必须举例说明用法。
(15分)
若某个方法可能会发生异常,但不想在当前方法中处理这个异常,则可以使用throws、throw关键字在方法中抛出异常。
throw关键字通常用于方法体中,并且抛出一个异常对象,程序在执行到throw语句时立即终止,它后面的语句都不执行。
throws关键字通常被应用在声明方法时,用来指定方法可能抛出的异常,多个异常可以使用逗号分隔,使用throws关键字将异常抛给上一级后,如果不想处理该异常,可以继续向上抛出,但最终要有能够处理该异常的代码。
/*
*
在类Main中创建pop()方法,在该方法中抛出Exception异常,在主方法中调用该方法,并实现异常处理
*/
Main{
//创建类
staticvoid
pop()
throws
Exception{
//定义方法并抛出异常
inta=1/0;
//除数为0
args){//主方法
try
pop();
//调用pop()方法
catch
(Exception
e){
pop()方法抛出的异常"
//输出异常信息
使用throw关键字直接在程序中抛出异常
Main{
inta
=1;
if(a==1){
thrownew
NumberFormatException();
else
System.out.println(a);
final用于声明属性、方法和类,分别表示属性不可变、方法不可覆盖和类不可被继承。
Finally作为异常处理的一部分,只能用在try/catch语句中,并且附带一个语句块,表示这段语句最终一定被执行。
类Main被声明为final,所以不能被继承,所有方法都不能被重写。
*finally中的代码一定会被执行,即使程序被return中。
publicfinalclass
Main
m
Main();
NullPointerException();
(NullPointerException
程序抛出了异常"
finally
执行了finally语句块"
}
3、编写一个描述学生基本情况的类,属性包括姓名,学号,语文成绩,数学成绩和英语成绩,方法包括信息输出,设置姓名和学号,设置三门课程成绩,计算总成绩和平均成绩。
在main方法中对方法进行测试(15分)
Main{
private
String
number,name;
privatedoubleChinese,Math,English;
public
Main(String
a,String
b,doublec,doubled,doublee){//有参构造函数
number=a;
name=b;
Chinese=c;
Math=d;
English=e;
setName(String
name){//设置姓名
this.name=name;
setNumber(String
num){//设置学号
this.number=num;
setChinese(doublescore){//设置语文成绩
this.Chinese=score;
setMath(doublescore){//设置数学成绩
this.Math=score;
setEnglish(doublescore){//设置英语成绩
this.English=score;
StringgetNumber(){//获取学号
returnnumber;
StringgetName(){
returnname;
publicdouble
getChinese(){
returnChinese;
getMath(){
returnMath;
getEnglish(){
returnEnglish;
getSum(){//计算总成绩
return
getChinese()+getMath()+getEnglish();
getAverage(){//计算平均成绩
getSum()/3;
show(){//信息输出
姓名:
"
+getName());
学号:
+getNumber());
语文成绩:
+getChinese());
+getMath());
+getEnglish());
args){
s1
Main("
12213"
"
sname"
85,82,98);
//调用有参构造函数初始化
s1.setChinese(95);
//设置语文成绩
s1.show();
//输出所有信息
总成绩:
+s1.getSum()+"
平均分:
+String.format("
%.2f"
s1.getAverage()));
//平均分结果保留两位小数
4、Java中实现多线程有几种方式?
这几种方式有什么区别?
然后采取其中一种方式设计一个线程例子,在例子中构造4个线程对象实现对同一数据类对象进行操作(数据初始值为0),其中线程对象1对数据执行+10的操作,线程对象2对数据执行+20的操作,对象3对数据执行乘以3的操作,线程对象4对数据执行除以4的操作,,要求考虑线程同步,保证数据操作的正确性。
要求提供程序代码以及运行结果截图(15分)
四种方式:
继承Thread类,重写其中的run方法,最后调用其start方法,开启新的线程来执行重写的run方法。
实现Runnable接口实现里面的run方法,将该实现类的对象传入Thread中,调用Thread的start方法,开启新的线程来执行Runnable接口实现类的run方法。
实现Callable接口实现里面的call方法,将该实现类的对象传入FutureTask对象中,再将FutureTask对象传入Thread中,调用Thread的start方法,开启新的线程来执行Callable接口实现类的call方法。
Future接口实现类对象=ExecutorService接口实现类对象即线程池对象.submit(Callable接口实现类对象),以上使用线程池来实现多线程。
四种方式的区别:
相比于继承Thread类,实现Runnable接口,Callable可以避免Java单继承带来的局限性;
Runnable,Callable接口的实现类可以被多个线程共享,实现了代码的复用。
继承Thread类和实现Runnable方法都是实现run方法,没有返回值,而另外两种都要实现Callable接口的call方法,有返回值。
二、编程题
1、编写一个图形用户界面程序,包含两个按钮,一个信息标签(label)和一个显示面板,两个按钮分别为“掷色子”和“移动”,在显示面板中显示一个小人(用小圆以及线绘制),随机设定小人的初始位置,当点击“掷色子”按钮,随机产生移动信息(上移,下移,左移,右移,移动几步),并显示在信息标签中,点击移动,按照产生的移动信息,让小人进行移动。
要求提供完整程序代码以及运行结果截图(20分)
importjava.awt.*;
importjavax.swing.*;
publicclassJxxkextendsJFrame
privateJTabbedPanetabbedPane;
privateJLabellabel1,label2,label3;
privateJPanelpanel1,panel2,panel3;
publicJxxk()
{
super("
选项卡窗口"
setSize(400,300);
Containerc=getContentPane();
tabbedPane=newJTabbedPane();
//创建选项卡面板对象
//创建标签
label1=newJLabel("
第一个标签的面板"
SwingConstants.CENTER);
label2=newJLabel("
第二个标签的面板"
label3=newJLabel("
第三个标签的面板"
//创建面板
panel1=newJPanel();
panel2=newJPanel();
panel3=newJPanel();
panel1.add(label1);
panel2.add(label2);
panel3.add(label3);
panel1.setBackground(Color.yellow);
panel2.setBackground(Color.blue);
panel3.setBackground(Color.green);
//将标签面板加入到选项卡面板对象上
tabbedPane.addTab("
标签1"
null,panel1,"
Firstpanel"
标签2"
null,panel2,"
Secondpanel"
标签3"
null,panel3,"
Thirdpanel"
c.add(tabbedPane);
c.setBackground(Color.white);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
publicstaticvoidmain(Stringargs[])
Jxxkd=newJxxk();
2、编写一个班级推优(优秀学生干部)投票管理程序。
列出参与推优的学生名单(6名),可以勾选进行投票,要求每个参选学生前面有图标表示候选人的职务,每人可以投3票,每次投票后能够显示当前投票人数以及每名候选者得票数,图形化柱状图显示得票数,可以保存投票结果到文本文件。
publicclassVoteOperate{
privatePerson[]per={newPerson("
小张"
001,0),newPerson("
小王"
002,0),newPerson("
小夏"
003,0),
newPerson("
丁丁"
004,0),newPerson("
刘强"
005,0),newPerson("
小赵"
006,0)};
privateInputDatainput;
privatebooleanflag=true;
privateintsum;
privateinterrorVote;
publicVoteOperate()
this.input=newInputData();
while(flag)
++sum;
this.voteForCandidate();
this.printInfo();
this.getResulet();
privatePerson[]per={newPerson("
newPerson("
privateInputDatainput;
privatebooleanflag=true;
privateintsum;
privateinterrorVote;
publicVoteOperate()