您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 其它文档 > -类继承与接口(三)实验报告
浙江大学城市学院实验报告课程名称:面向对象程序设计实验项目名称:类继承与接口(三)学生姓名:专业:软件工程学号:实验地点:实验日期:年月日【实验目的】1.巩固Java类继承的相关知识2.理解对象上转型技术的优点和用途。3.掌握接口的特点4.接口与抽象类的异同之处【实验内容】一、类继承相关知识强化1.执行以下程序,给出执行Bbb的结果,并说明指出类Bbb的this.i与super.i的含义(即它们都对应哪个变量)。classAaa{inti;Aaa(inta){i=a;}}classBbbextendsAaa{intj,k;Bbb(inti){super(i);j=this.i;k=super.i;}publicstaticvoidmain(String[]args){Bbbb=newBbb(18);System.out.println(b.j+\t+b.k);}}执行Bbb的结果:this.i与super.i的含义(即它们都对应哪个类中定义的变量):this.i和super.i都对应Aaa中的变量2.接着上面例子,将类Bbb改写为以下代码,请写出程序运行结果,并说明这个例子与上面例子的区别。classBbbextendsAaa{inti=-1,j=-1,k=-1;//比上面例子增加一个实例变量i;Bbb(inti){super(i);j=this.i;//本语句含义是:k=super.i;//本语句含义是:}publicstaticvoidmain(String[]args){Bbbb=newBbb(18);System.out.println(b.j+\t+b.k);}}执行Bbb的结果:这个例子与上面例子的区别:this.i对应Bbb中的isuper.i对应Aaa中的i3.对以下程序,给出执行Bbb的结果,并分析Bbb中main方法中a.show(1),b.show(1),c.show(1)的结果。classAaa{voidshow(){System.out.println(Aaa中定义的show());}voidshow(inti){System.out.println(Aaa中定义的show(inti));}}classBbbextendsAaa{voidshow(){System.out.println(Bbb中定义的show());}publicstaticvoidmain(String[]args){Aaaa=newAaa();Bbbb=newBbb();Aaac=newBbb();a.show(1);b.show(1);c.show(1);}}执行Bbb的结果:上面a.show(1)执行了那个类中定义的方法:上面b.show(1);执行了那个类中定义的方法:上面c.show(1)执行了那个类中定义的方法:分析:因为执行的是有参数的voidshow()所以调用的是Aaa中的方法。C是上转型所以也是调用Aaa中的方法4.对以下程序,给出执行Bbb的结果,并分析这个例子结果与前面第4个例子,你可以得出什么结论。classAaa{inti=10;staticvoidshow(){System.out.println(Aaa中定义的show());}}classBbbextendsAaa{inti=20;staticvoidshow(){System.out.println(Bbb中定义的show());}publicstaticvoidmain(String[]args){Aaaa=newAaa();Bbbb=newBbb();Aaac=newBbb();a.show();b.show();c.show();((Bbb)c).show();System.out.println(c.i);//考虑此处System.out.println(((Bbb)c).i);//考虑此处}}执行Bbb的结果:((Bbb)c).show()执行结果:System.out.println(c.i)执行结果:System.out.println(((Bbb)c).i)执行结果:分析与结论:C进行的向上转型,将子类对象引用转换为超类类型。所以c.i引用的是超类中的I而也可以通过(Bbb)c向下转型二、程序分析思考以下是例5.22的部分关键代码,请分析思考以下问题:(1)Student类中设计抽象方法cost会带来什么好处?因为不同的学生所需要的学费不同,所以用抽象cost方法在不用的学生中调用cost执行不同的代码返回对应的值。(2)Student类的compareCost方法可以用于比较哪些类型的对象?如果没有设计抽象方法cost,那么会发生什么问题?可以比较上转型对象和子类对象。如果没有抽象方法cost那么就必须在每一个子类都编写一个compareCost导致太多的重复代码。注意:分析重点是软件设计的通用性考虑。abstractclassStudent{//定义学生对象的抽象超类privateStringname;publicStudent(Stringname){this.name=name;}publicabstractdoublecost();//声明抽象方法,表示学习费用publicdoublecompareCost(StudentotherStudent){//当前对象与参数对象的费用比较returnthis.cost()-otherStudent.cost();//返回大于、等于、小于零的数字}publicStringgetName(){returnthis.name;}publicvoidsetName(Stringname){this.name=name;}}classStudentCostTool{staticdoublesumCost(Student[]students){//计算students所有学生的费用之和doublesum=0;for(inti=0;istudents.length;i++)sum=sum+students[i].cost();returnsum;}staticdoubleaverageCost(Student[]students){//计算students学生的平均费用returnsumCost(students)/students.length;}staticdoublemaxCost(Student[]students){//计算students所有学生的费用最大值if(students.length==1)returnstudents[0].cost();intindex=0;for(inti=0;istudents.length;i++)if(students[index].compareCost(students[i])0)index=i;returnstudents[index].cost();}}三、接口与抽象类实验1.编译下面的程序,指出错误.interfaceA{//语句1voidshow();voidshow(inti){System.out.println(Ashow());}}(1)是否出错?出错原因?是,接口A必须是抽象方法即不能有实现代码。(2)如果将上面语句1的interface改为abstractclass,编译是否出错?(提示:注意abstract修饰符)是。之后变成了抽象类,那么voidshow()前面也应该加absrtract(3)根据上面的(1)和(2),可以看出接口与抽象类的什么区别?接口中只能声明抽象方法,抽象类中既能声明抽象方法,也能声明非抽象方法,但抽象方法前面需要加上abstract。接口则不需要。2.编译下面的程序,指出错误.interfaceIA{voidshow();voidshow(inti);}classAimplementsIA{//语句1publicvoidshow(inti){//语句2System.out.println(Ashow());}}(1)上面的程序编译是否出错?出错原因?出错,voidshow没有实现(2)如果将语句1中的class改为abstractclass,编译是否出错?为何?否,因为抽象类可以不具体实现。(3)如果将语句2中的public删除,编译是否出错?为何?出错,因为interface中的方法都是public所以子类中也应该声明为public3.编译下面的程序,回答问题abstractclassA{publicvoidshow(){System.out.println(Ashow());}}classAbstractClassTest{publicstaticvoidmain(String[]args){Aa=newA();}}(1)编译是否出错?出错(2)类A的定义编译是否出错?说明什么?(考虑抽象类中是否可以没有抽象方法)不出错,因为抽象类中是否可以没有抽象方法4.编译下面的程序,回答问题abstractclassA{staticabstractvoidshow();}classBextendsA{publicstaticvoidmain(String[]args){show();}}(1)上面的程序编译是否出错?是(2)如何改正?abstractclassA{publicstaticabstractvoidshow();}5.编译下面的程序,回答问题interfaceIA{inti;voidshow();}(1)上面的程序编译是否出错?是,(2)如果出错,错在何处?I应该是一个静态常量需要赋值6.编译下面的程序,回答问题.interfaceIA{inti=100;voidshow();//代码1}interfaceIB{intj=100;voidshow(inta);//代码2}classAimplementsIA,IB{publicvoidshow(){}//代码3publicvoidshow(inta){}//代码4}(1)上面的程序编译是否出错?否(2)代码1和代码3的区别是什么?同样,代码2与代码4的区别是什么?1方法的声明,3是方法的实现7.编译下面的程序,回答问题.abstractclassA{voidshow1(){}}abstractclassB{voidshow2(){}}classCextendsA,B{voidshow3(){}}(1)上面的程序编译是否出错?出错(2)如果出错,错在何处?类不能多重继承8.编译下面的程序,回答问题.finalclassA{voidshow(){}}classBextendsA{voidshow2(){}}(1)上面的程序编译是否出错?是(2)如果出错,错在何处?Final定义的不能继承9.编译下面的程序,回答问题.classA{finalvoidshow(){}}classBextendsA{voidshow(){System.out.println(aaa);}}(1)上面的程序编译是否出错?出错(2)如果出错,错在何处?Final类不能被覆盖10.编译下面的程序,回答问题.interfaceIA{}//没有定义任何成员classB{}//没有定义任何成员(1)上面的程序编译是否出错?否(2)如果没有出错,你可以得出什么结论?接口和类都可以为空11.编译并运行下面程序,分析运行结果interfaceIStudent{voidshowDetail();}classStudentimplementsIStudent{Stringname;intage;Student(){}Student(Stringname,intage){this.name=name;this.age=age;}publicvoidshowDetail(){System.out.println(name+\t+age);}}classGraduateStudentimplementsIStudent{Stringname;intage;Strin
本文标题:-类继承与接口(三)实验报告
链接地址:https://www.777doc.com/doc-3046598 .html