java语言程序设计
一、简答题
1 什么是多态性? 方法的重载和覆盖有何区别? 阅读下列代码,指出其中存在的重载和覆盖, 写出输出结果是什么?解释为什么这样输出? (15分)
class C1
{
publicvoid f(){
System.out.println("C1.f");
}
}
class C2 extends C1
{
publicvoid f(){
System.out.println("C2.f");
}
}
class C3 {
publicvoid g(C1one) {
System.out.println("g(C1)");
one.f();
}
publicvoid g(C2two) {
System.out.println("g(C2)");
two.f();
}
}
publicclassMain1
{
publicstaticvoidmain(String[] args) {
C1one = new C2();
C3three = new C3();
three.g(one);
}
}
2、请用自己的语言介绍throw/throws有什么联系和区别?在程序中应如何使用?另外谈谈final、finally的区别和作用,必须举例说明用法。(15分)
3、编写一个描述学生基本情况的类,属性包括姓名,学号,语文成绩,数学成绩和英语成绩,方法包括信息输出,设置姓名和学号,设置三门课程成绩,计算总成绩和平均成绩。在main方法中对方法进行测试(15分)
4、Java中实现多线程有几种方式?这几种方式有什么区别?然后采取其中一种方式设计一个线程例子,在例子中构造4个线程对象实现对同一数据类对象进行操作(数据初始值为0),其中线程对象1对数据执行+10的操作,线程对象2对数据执行+20的操作, 对象3对数据执行乘以3的操作,线程对象4对数据执行除以4的操作,,要求考虑线程同步,保证数据操作的正确性。要求提供程序代码以及运行结果截图(15分)
二、编程题
1、编写一个图形用户界面程序,包含两个按钮,一个信息标签(label)和一个显示面板,两个按钮分别为“掷色子”和“移动”,在显示面板中显示一个小人(用小圆以及线绘制),随机设定小人的初始位置,当点击“掷色子”按钮,随机产生移动信息(上移,下移,左移,右移,移动几步),并显示在信息标签中,点击移动,按照产生的移动信息,让小人进行移动。要求提供完整程序代码以及运行结果截图(20分)
2、编写一个班级推优(优秀学生干部)投票管理程序。列出参与推优的学生名单(6名),可以勾选进行投票,要求每个参选学生前面有图标表示候选人的职务,每人可以投3票,每次投票后能够显示当前投票人数以及每名候选者得票数,图形化柱状图显示得票数,可以保存投票结果到文本文件。要求提供完整程序代码以及运行结果截图(20分)
答案:
一、
1.多态性是指允许不同类的对象对统一消息做出响应。多态包括参数化多态和包含多态。多态性语言具有灵活、抽象、行为共享、代码共享等优势,很好地解决了应用程序函数同名问题。
重载是指同一个类中有多个同名的方法,但这些方法有着不同的参数,因此在编译时就可以确定到底调用哪个方法,它是一种编译时多态。覆盖是指子类可以覆盖父类的方法,同样的方法会在子类和父类中有着不同的变现形式。即重载是一个类的多态性表现,而覆盖是子类和父类的一种多态性表现。
class C1 { publicvoid f() { System.out.println("C1.f"); } } class C2 extends C1 { publicvoid f() { System.out.println("C2.f");//覆盖,子类C2重写了父类C1中的f()方法 } } class C3 { publicvoid g(C1 one) { System.out.println("g(C1)"); one.f(); } publicvoid g(C2 two) {//重载,根据传入参数不同,C3实现不同的g()方法 System.out.println("g(C2)"); two.f(); } } publicclass Main1 { publicstaticvoid main(String[] args) { C1 one = new C2(); C3 three = new C3(); 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.若某个方法可能会发生异常,但不想在当前方法中处理这个异常,则可以使用throws、throw关键字在方法中抛出异常。throw关键字通常用于方法体中,并且抛出一个异常对象,程序在执行到throw语句时立即终止,它后面的语句都不执行。throws关键字通常被应用在声明方法时,用来指定方法可能抛出的异常,多个异常可以使用逗号分隔,使用throws关键字将异常抛给上一级后,如果不想处理该异常,可以继续向上抛出,但最终要有能够处理该异常的代码。
/* * 在类Main中创建pop()方法,在该方法中抛出Exception异常,在主方法中调用该方法,并实现异常处理 */ publicclass Main { //创建类 staticvoid pop() throws Exception { //定义方法并抛出异常 inta=1/0;//除数为0 } publicstaticvoid main(String[] args) {//主方法 try { pop(); //调用pop()方法 } catch (Exception e) { System.out.println("pop()方法抛出的异常");//输出异常信息 } } } |
/* * 使用throw关键字直接在程序中抛出异常 */ publicclass Main { publicstaticvoid main(String[] args) { inta = 1; if(a==1) { thrownew NumberFormatException(); } else { System.out.println(a); } } } |
final用于声明属性、方法和类,分别表示属性不可变、方法不可覆盖和类不可被继承。Finally作为异常处理的一部分,只能用在try/catch语句中,并且附带一个语句块,表示这段语句最终一定被执行。
/* * 类Main被声明为final,所以不能被继承,所有方法都不能被重写。 * finally中的代码一定会被执行,即使程序被return中。 */ publicfinalclass Main { publicstaticvoid main(String[] args) { Main m = new Main(); try { thrownew NullPointerException(); } catch (NullPointerException e) { System.out.println("程序抛出了异常"); } finally { System.out.println("执行了finally语句块"); } } } |
3.
publicclass 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; } publicvoid setName(String name){//设置姓名 this.name=name; } publicvoid setNumber(String num){//设置学号 this.number=num; } publicvoid setChinese(doublescore){//设置语文成绩 this.Chinese=score; } publicvoid setMath(doublescore){//设置数学成绩 this.Math=score; } publicvoid setEnglish(doublescore){//设置英语成绩 this.English=score; } public String getNumber(){//获取学号 returnnumber; } public String getName(){ returnname; } publicdouble getChinese(){ returnChinese; } publicdouble getMath(){ returnMath; } publicdouble getEnglish(){ returnEnglish; } publicdouble getSum(){//计算总成绩 return getChinese()+getMath()+getEnglish(); } publicdouble getAverage(){//计算平均成绩 return getSum()/3; } publicvoid show(){//信息输出 System.out.println("姓名:"+getName()); System.out.println("学号:"+getNumber()); System.out.println("语文成绩:"+getChinese()); System.out.println("语文成绩:"+getMath()); System.out.println("语文成绩:"+getEnglish()); } publicstaticvoid main(String[] args){ Main s1 = new Main("12213","sname",85,82,98);//调用有参构造函数初始化 s1.setChinese(95);//设置语文成绩 s1.show();//输出所有信息 System.out.println("总成绩:"+s1.getSum()+" 平均分:"+String.format("%.2f", s1.getAverage()));//平均分结果保留两位小数 } } |
输出结果:
相关阅读
replace() 方法通过用 newChar 字符替换字符串中出现的所有 oldChar 字符,并返回替换后的新字符串。语法:public String replace(ch
委派模式有点像代理模式又有点像策略模式。例如:公司老板给项目经理下达任务,将任务全权交给项目经理,由项目经理根据一定的策略将任
如果希望保存一组有相同类型的数,可以使用数组。今天天气不错,来复习复习Java数组。数组的定义和和内存分配Java中定义数组的语法有
可以看这篇. serialVersionUID适用于Java的序列化机制。简单来说,Java的序列化机制是通过判断类的serialVersionUID来验证版本一
学习要学以致用,于是写了一个粗糙的java图书管理系统,实现了图书的增删改查的基本操作,在写的过程中遇到了很多问题,不过也都通过暴力