1、Java程序设计实验四:继承、多态与接口1. 提交期限和方法期限:第12周周五(2015-11-27)23:59 pm 方法:由学习委员收集所有学生的实验报告,以电子档的形式提交给任课教师(发邮箱: )。2. 实验目的及要求掌握Java的基本数据类型、运算符、表达式和语句。运行环境:JDK1.7开发环境:Eclipse3. 实验内容及题目3.1 子类的继承与方法的重写【题1 中国人与美国人】在Eclipse 中创建名为Lab4的新项目,编写程序模拟中国人、美国人、北京人。除主类外,程序中有4个类:People、ChinaPeople、AmericanPeople和BeijingPeople类。
2、要求如下:(1)People类有权限是protected的double型成员变量:height和weight,以及public void speakHello( )、public void averageHeight( )和public void averageWeight( )方法。(2)ChinaPeople类是People类的子类,新增了public void chinaGongfu( )方法。要求ChinaPeople重写父类的public void speakHello ()、public void averageHeight( )和public void averageWeight
3、( )方法。(3)AmericanPeople类是People的子类,新增public void americanBoxing( )方法。要求AmericanPeople重写父类的public void speakHello( )、public void averageHeight( )和public void averageWeight( )方法。(4)BeijingPeople类是ChinaPeople的子类,新增public void beijingOpera( )方法。要求BeijingPeople重写父类的public void speakHello( )、public void a
4、verageHeight( )和public void averageWeight( )方法。运行效果如下图。按下列代码模板要求,将【代码】部分替换为Java程序代码。部分代码已给出:/People.javapublic class People protected double weight, height;public void speakHello() System.out.println(yayayaya);public void averageHeight()height = 173;System.out.println(average height: + height);publi
5、c void averageWeight()weight = 70;System.out.println(average weight: + weight);/ChinaPeople.javapublic class ChinaPeople extends Peoplepublic void speakHello() System.out.println(您好);public void averageHeight()height = 168.78;System.out.println(中国人平均身高: + height + 厘米);/重写public void averageWeight()方
6、法,输出:中国人平均体重:65 公斤/【代码1】public void chinaGongfu()System.out.println(坐如钟,站如松,睡如弓);/AmericanPeople.javapublic class AmericanPeople extends People /重写public void speakHello()方法,输出How do you do/【代码2】/重写public void averageHeight()方法,输出Americans average height:176 cm/【代码3】public void averageWeight()weight
7、 = 75;System.out.println(Americans average weight: + weight + kg);public void americanBoxing()System.out.println(直拳、勾拳、组合拳);/BeijingPeople.javapublic class BeijingPeople extends ChinaPeople /重写public void averageHeight()方法,输出北京人的平均身高:172.5 厘米/【代码4】/重写public void averageWeight()方法,输出北京人的平均体重:70 公斤/【代
8、码5】public void beijingOpera()System.out.println(花脸、青衣、花旦和老生);/Example.javapublic class Examplepublic static void main(String args) ChinaPeople chinaPeople = new ChinaPeople();AmericanPeople americanPeople = new AmericanPeople();BeijingPeople beijingPeople = new BeijingPeople();chinaPeople.speakHello
9、();americanPeople.speakHello();beijingPeople.speakHello();chinaPeople.averageHeight();americanPeople.averageHeight();beijingPeople.averageHeight();chinaPeople.averageWeight();americanPeople.averageWeight();beijingPeople.averageWeight();chinaPeople.chinaGongfu();americanPeople.americanBoxing();beijin
10、gPeople.beijingOpera();beijingPeople.chinaGongfu();【本题知识点】1. 子类的继承性;2. 子类对象的创建过程;3. 方法的继承与重写。【实验指导】1. 如果子类可以继承父类的方法,子类就有权利重写这个方法,子类通过重写父类的方法可以改变方法的具体行为。2. 方法重写时一定要保证方法的名字、类型、参数个数和类型同父类的某个方法完全相同,只有这样,子类继承的这个方法才被隐藏。3. 子类在重写方法时,不可以将实例方法更改成类方法,也不可以将类方法更改为实例方法,即如果重写的方法是static方法,static关键字必须要保留;如果重写的方法是实例方
11、法,重写时不可以用static修饰该方法。【学生解答】(1)程序代码:【代码1】public void averageWeight()weight = 65;System.out.println(中国人平均体重: + weight+公斤);【代码2】public void speakHello() System.out.println(How do you do);【代码3】public void averageHeight()height = 176;System.out.println(Americans average height:+height +cm);【代码4】public vo
12、id averageHeight()height = 172.5;System.out.println(北京人平均身高: + height + 厘米);【代码5】public void averageWeight()weight = 70;System.out.println(北京人平均体重: + weight+公斤);(2)运行结果截图:【思考题(选做)】People类中的public void speakHello( ), public void averageHeight( ), public void averageWeight( )三个方法的方法体中的语句是否可以省略?【答:】可以省
13、略.3.2 成员变量隐藏与super关键字【题2 银行与利息】在Lab4项目中,编写程序。验证教材第5章81页的【例 5-7】。假设银行Bank已经有了按整年year计算利息的一般方法,其中year只能取正整数。如按整年计算的方法:Double compuerInterest()interest = year * 0.35 * savedMoney;return interest;建设银行的天利息计算公式为:dayInterst = 天数 * 0.0001 * 存款数大连银行的天利息计算公式为:dayInterst = 天数 * 0.00012 * 存款数参照例子中的建设银行或大连银行,再编写
14、一个商业银行,让程序输出8000元存在商业银行8年零236天的利息。【知识点】1. 成员变量隐藏和方法重写;2. super关键字。【实验指导】1. 当super调用被隐藏的方法时,该方法中出现的成员变量是被子类隐藏的成员变量或继承的成员变量。2. 子类不继承父类的构造方法,因此,子类在其构造方法中需使用super来调用父类的构造方法,而且super必须是子类构造方法中的头一条语句,即如果在在子类的构造方法中,没有明显地写出super关键字来调用父类的某个构造方法,那么默认有“super( );”。3. 类中定义多个构造方法时,建议包括一个不带参数的构造方法,以便子类可以省略“super( )
15、;”。【学生解答】(1)商业银行的程序代码:class Bankint savedMoney;int year;double interest;public double computerInterest()interest = year*0.035*savedMoney;return interest;class BusinessBank extends Bankdouble year;public double computerInterest()super.year = (int) year;double remainNumber = year - (int)year;int day =
16、 (int)(remainNumber*1000);interest = puterInterest()+day*0.0001*savedMoney;System.out.printf(%d元存在商业银行%d年零%d天的利息:%.2f元n,savedMoney,super.year,day,interest);return interest;public class Example5_2 public static void main(String args)BusinessBank bank1 = new BusinessBank();bank1.savedMoney = 8000;bank
17、1.year = 5.236;double interest1 = puterInterest();(2)商业银行的运行结果截图:3.3 接口【题3 歌手大赛与学生体重评估】在Lab4项目中,编写程序,要求模拟歌手大赛计算选手成绩和评估班级学生体重。歌手大赛计算选手成绩的方法是去掉一个最高分和一个最低分后再计算平均分,而学校评估一个班级的学生的体重时,是计算全班同学的平均体重。SongGame类和School类都实现了ComputerAverage接口,但实现方式不同。ComputerAverage类和Estimator主类的部分代码已给出(如下),按下列代码模板要求,将【代码】部分替换为Ja
18、va程序代码,并写出SongGame类和School类。/ComputerAverage.javapublic interface ComputerAverage/接口public double average(double x);/Estimator.javapublic class Estimator /主类public static void main(String args) double a = 9.89, 9.88, 9.99, 9.12, 9.69, 9.76, 8.97;double b = 56, 55.5, 65, 50, 51.5, 53.6, 70, 49, 66, 6
19、2, 46;ComputerAverage computer;computer = new SongGame();/computer调用average(double x)方法,将数组a传递给参数x/【代码1】System.out.printf(%n);System.out.printf(歌手最后得分:%5.3fn, result);computer = new School();/computer调用average(double x)方法,将数组b传递给参数x/【代码2】System.out.printf(学生平均体重:%5.2f kg, result);运行效果如下图。【知识点】1. 接口体
20、中只有常量的声明(没有变量)和抽象方法声明。而且接口体中所有的常量的访问权限一定都是public(允许省略public、final修饰符)、所有的抽象方法的访问权限一定都是public(允许省略public、abstract修饰符)。2. 类实现接口,以便绑定接口中的方法。一个类可以实现多个接口,类通过使用关键字implements声明自己实现一个或多个接口。如果一个非抽象类实现了某个接口,那么这个类必须重写的所有方法。【实验指导】1. 可以把实现某一接口的类创建的对象的引用赋给该接口声明的接口变量中,那么该接口变量就可以调用被类实现的接口方法。2. 接口产生的多态就是指不同类在实现同一个接口
21、时可能具有不同的实现方式。【学生解答】(1)程序代码:【代码1】double result = computer.average(a);【代码2】result = computer.average(b);/ SongGame.javaclass SongGame implements ComputerAveragepublic double average(double x)double min=10,max=-20,sum=0;for(int i = 0;ix.length;i+)if(xi=max)max = xi;sum+=xi;sum = sum - min - max;sum = (
22、double)(sum/(x.length-2);return sum;/School.javaclass School implements ComputerAveragepublic double average(double x)double sum = 0;for(int i = 0; ix.length;i+)sum+= xi;double aver = (double)(sum/x.length);return aver;(2)运行结果截图:【思考题(选做)】School类如果不重写public double average(double x)方法,程序编译时提示怎样的错误?【答:
23、】3.4 接口回调(选做)【题4(选做) 天气预报】在Lab4项目中,编写一个天气预报的Java应用程序,天气可能出现不同的状态,要求用接口封装天气的状态,具体要求如下:(1)编写一个接口WeatherState,该接口有一个名字为void showState( )的方法。(2)编写Weather类,该类中有一个WeatherState接口声明的变量state。另外,该类有一个show( )方法,在该方法中让接口state回调showstate( )方法。(3)编写若干个实现WeatherState接口的类,负责刻画天气的各种状态。(4)编写主类,在主类中进行天气预报。程序运行效果如下图。【知
24、识点】掌握面向接口的编程思想:1. 程序设计时经常会使用接口,因为接口只关心操作,不关心这些操作具体实现的细节,可以使程序的设计者把主要精力放在程序的设计上,而不拘泥于细节的实现(细节留给接口的实现者),即避免设计者把大量的时间和精力花费与具体的算法上。2. 使用接口进行程序设计的核心技术之一是使用接口回调,即将实现接口的类的对象的引用放到接口变量中,那么这个接口变量就可以调用类实现的接口方法。3. 面向接口编程,是指当设计某种重要的类是,不让该类面向具体的类,而是面向接口,即所设计类中的重要数据是接口声明的变量,而不是具体类声明的对象。【学生解答】(1)程序代码:/WeatherState.
25、javapublic interface WeatherState public void showState();/TodayMoring.javaclass TodayMoring implements WeatherStatepublic void showState()System.out.println(今天白天:多云,有时阴。);/TodayNight.javaclass TodayNight implements WeatherStatepublic void showState()System.out.println(今天夜间:小雨转大雨);/ TomorrowMoring.j
26、avaclass TomorrowMoring implements WeatherStatepublic void showState()System.out.println(明天白天:小雨。);/ TomorrowNight.javaclass TomorrowNight implements WeatherStatepublic void showState()System.out.println(明天夜间:少云,有时晴);class weatherWeatherState state ;void show(WeatherState state)state.showState();pub
27、lic class WeatherForecast public static void main (String args)WeatherState weath;weath = new TodayMoring();weath.showState();weath = new TodayNight();weath.showState();weather w = new weather();w.show(new TomorrowMoring(); /接口回调w.show(new TomorrowNight();(2)运行结果截图:4. 提交要求本次实验需提交的文件包括:(1)实验报告的word文档
28、,文件名格式为:学号姓名班级实验X.doc(例如:14031103张三1班实验1.doc),将word文档的实验报告放入以“学号姓名班级实验X”命名的文件夹中。如下图所示。(2)Java源文件,建立一个以“学号姓名班级实验X”命名的文件夹(例如:14031103张三1班实验1),文件夹里包含所要求建立的,以及项目中每题的Java源程序。如下图所示。本次实验为个人任务,需独立完成,以电子档的形式提交给学习委员,再由学习委员在规定期限内提交给任课老师。未按时提交实验报告者,每迟交一天扣一个等级分(比如,原本为A等级的,迟交一天降为A-),扣完为止。经辅导员同意并签字的事病假时间不计入迟交范围。凡被发现实验报告有抄袭者,本次成绩以零分记。5. 实验报告成绩等级划分成绩等级对应的百分制分数A+95 100A90 94A-85 89B+80 84B75 79B-70 74C+65 69C60 64C-50 59F0 49