实验三:类的继承及多态一、实验目的1.掌握类的继承方法及上转型对象的方法调用。2.掌握this和super的区别及使用。3.理解抽象类的概念及作用,掌握接口的声明,实现及接口回调。。二、实验编程内容1.设计一个抽象类,声明有关算术运算的方法,并创建四个子类继承该抽象的类,完成进行加、减、乘、除四则运算。2.编写一个ComputerAverage抽象类,类中有一个抽象方法求平均分average,可以有参数。定义Gymnastics类和School类,它们都是ComputerAverage的子类,Gymnastics类中计算选手的平均成绩的方法是去掉一个最低分,去掉一个最高分,然后求平均分。School中计算平均分的方法是直接是总分除以总科目。要求:定义ComputerAverage的对象为上转型对象,并调用重写的方法averge。3.编写一个类,该类有如下一个方法:publicintf(inta,intb){……//要求该方法将返回a和b的最大公约数},再编写一个该类的子类,要求子类重写方法f(),而且重写的方法将返回两个正整数的最小公倍数。要求:在重写的方法的方法体中需要调用被隐藏的方法返回a和b的最大公约数m,然后将(a*b/m)返回;在应用的程序的主类中分别使用父类和子类创建对象,并分别调用方法f()计算两个正整数的最大公约数和最小公倍数。4编写一个圆锥类,能够计算圆锥的体积,要求圆锥类的构造函数中有一参数是圆类的一个对象。5定义接口Shape,其中包括Area方法。类Circle、Square和Triangle均实现了接口Shape。定义主函数,创建元素个数为3的Shape类型的一维数组,分别为数组元素创建Circle、Square和Triangle类型的对象,最后分别调用各数组元素的Area方法,输出相关信息。6定义一个接口,用于查询课程定义一个类Student,包括如下属性:学号(ID)、姓名(name)、性别(Sex)、出生日期(birthDate)、专业(specialty)、课程(course),实现以下方法:每个属性的获取和定义,要求至少包含一个构造方法。定义一个接口类,定义方法query_course_catalog()用来查询课程。编写一个接口,定义相关选课操作,定义Student实现该接口。三、实验运行内容1.类的继承性(1)在某个路径下创建一个文件,定义一个Person类,一个Student类,通过子类扩展父类的功能。【源代码】classPerson{privateStringname;privateintage;publicvoidsetName(Stringname){this.name=name;}publicStringgetName(){returnname;}}classStudentextendsPerson{privateStringschool;publicvoidsetSchool(Stringschool){this.school=school;}publicStringgetSchool(){returnschool;}}publicclassExtendsDemo{publicstaticvoidmain(Stringargs[]){Studentstu=newStudent();stu.setName(张三);stu.setSchool(清华大学);System.out.println(姓名:+stu.getName()+,学校:+stu.getSchool());}}⑵编译并运行该程序,观察运行的结果,参照下图。将姓名和年龄及学校改为自己的,观察运行结果。2.this和super的区别(1)在某个路径下创建一个文件,体会this和super的区别。【源代码】classPerson{publicStringname=张三;}classStudentextendsPerson{publicStringname=张童;publicvoidprint(){System.out.println(父类中属性:+super.name);System.out.println(子类中属性:+this.name);}}publicclassThisSuperDemo{publicstaticvoidmain(Stringargs[]){Studentstu=newStudent();stu.print();}}(2)编译并运行该程序,观察运行的结果,参照下图。3.抽象类⑴在某个路径下创建一个文件,体会重写抽象类中的抽象方法。【源代码】abstractclassPerson{privateStringname;//定义name属性publicPerson(Stringname){this.name=name;}publicvoidsetName(Stringname){this.name=name;}publicStringgetName(){returnthis.name;}publicabstractStringgetInfo();//抽象方法}classStudentextendsPerson{privateStringschool;publicStudent(Stringname,Stringschool){super(name);//指定要调用抽象类中的构造方法this.school=school;}publicvoidsetSchool(Stringschool){this.school=school;}publicStringgetSchool(){returnthis.school;}publicStringgetInfo(){return姓名:+super.getName()+;学校:+this.getSchool();}}publicclassAbstractDemo{publicstaticvoidmain(Stringargs[]){Studentstu=newStudent(张三,理工大学);System.out.println(stu.getInfo());}}⑵编译并运行该程序,观察运行的结果,参照下图。4.接口的定义和实现⑴在某个路径下创建一个文件。定义两个接口A和B,定义一个X类,并继承A和B两个接口,编写应用程序使用X类。【源代码】interfaceA{publicstaticfinalStringNAME=张三;//定义全局常量publicvoidprintA1();//定义抽象方法publicvoidprintA2();//定义抽象方法}interfaceB{publicvoidprintB();//定义抽象方法}classXimplementsA,B{publicvoidprintA1(){System.out.println(HelloWorld!);}publicvoidprintA2(){System.out.println(HelloChina!);}publicvoidprintB(){System.out.println(Hello+NAME);}}publicclassInterfaceDemo{publicstaticvoidmain(Stringargs[]){Xx=newX();x.printA1();x.printA2();x.printB();}}⑵编译并运行该程序,观察运行的结果,参照下图。5.抽象类和接口⑴在某个路径下创建一个文件。完成子类同时继承抽象类和实现接口。【源代码】interfaceA{publicstaticfinalStringNAME=张三;//定义全局常量publicvoidprintA1();//定义抽象方法publicvoidprintA2();//定义抽象方法}abstractclassB{publicabstractvoidprintB();}classXextendsBimplementsA{publicvoidprintA1(){System.out.println(HelloWorld!);}publicvoidprintA2(){System.out.println(HelloChina!);}publicvoidprintB(){System.out.println(Hello+NAME);}}publicclassInterfaceExtendsDemo{publicstaticvoidmain(Stringargs[]){Xx=newX();x.printA1();x.printA2();x.printB();}}⑵编译并运行该程序,观察运行的结果,参照下图。4.编译并运行下面的程序,分析运行结果,体会其中方法重载的用法,进一步理解方法重载的概念。classFather//本类中的speak方法重载了两次{voidspeak()//无参数的speak方法{System.out.println(″IamFather!″);}voidspeak(Strings)//有参数的speak方法{System.out.println(″Ilike″+″″+s+″.″);}}publicclassOverLoadingDemo{publicstaticvoidmain(Stringargs[]){Fatherx=newFather();x.speak();//调用无参的speak方法x.speak(″music″)//调用有参的speak方法}}四、思考题1.一个方法或一个块内定义的变量是否可以在方法外或块外使用?这种变量称为什么?如果方法中的参数的名字和成员变量的名字相同,可以用哪个关键字加以区分。2.同名的不同方法共存的情况称为什么?如何区分这些同名方法?3.试说出类方法和实例方法的不同。4.一个方法或一个块内定义的变量是否可以在方法外或块外使用?这种变量称为什么?方法的形式参数是否可以在方法之外使用?5.为什么说构造函数是一种特殊的方法?特殊在哪里?构造函数什么时候执行?被谁调用?6.子类重新定义与父类方法的方法头完全相同的方法,这种情况称为什么?7.同名的不同方法共存的情况称为什么?如何区分这些同名方法?8.定义一个类实现银行帐户的概念,包括的变量有“帐号”和“存款余额”,包括的方法有“存款”、“取款”和“查询余额”。定义主类,创建帐户类的对象,并完成相应操作。