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

    }

}

输出结果:

 

展开阅读全文

没有更多推荐了,返回首页