必威体育Betway必威体育官网
当前位置:首页 > IT技术

Java语言程序设计试题及部分答案

时间:2019-06-23 20:43:11来源:IT技术作者:seo实验室小编阅读:68次「手机版」
 

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()));//平均分结果保留两位小数

   }

}

输出结果:

相关阅读

java replace()函数的用法

replace() 方法通过用 newChar 字符替换字符串中出现的所有 oldChar 字符,并返回替换后的新字符串。语法:public String replace(ch

Java设计模式之委派模式

委派模式有点像代理模式又有点像策略模式。例如:公司老板给项目经理下达任务,将任务全权交给项目经理,由项目经理根据一定的策略将任

Java中数组的定义和使用

如果希望保存一组有相同类型的数,可以使用数组。今天天气不错,来复习复习Java数组。数组的定义和和内存分配Java中定义数组的语法有

Java的序列化机制

可以看这篇. serialVersionUID适用于Java的序列化机制。简单来说,Java的序列化机制是通过判断类的serialVersionUID来验证版本一

Java图书管理系统

学习要学以致用,于是写了一个粗糙的java图书管理系统,实现了图书的增删改查的基本操作,在写的过程中遇到了很多问题,不过也都通过暴力

分享到:

栏目导航

推荐阅读

热门阅读