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