第八次实验
实验1:中国人、北京人和美国人 1.实验要求:
编写程序模拟中国人、美国人是人,北京人是中国人。除主类外,程序中还有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 averageHeight()和public
voidaverageWeight()方法。
(3) AmericanPeople类是People的子类,新增方法public void AmericanBoxing() 。
要求AmericanPeople重写父类的public void speakHello()、public void averageHeight()和public void averageWeight()方法。
(4) BeijingPeople类是ChinaPeople的子类,新增public void beijingOpera()方
法。
2.实验代码: 验结果:
4.实验分析:
(1) 方法重写时要保证方法的名字、类型、参数的个数和类型同父类的某个方法完全想同。
这样,子类继承的方法才能被隐藏。
(2) 子类在重写方法时,如果重写的方法是static方法,static关键字必须保留;如果重
写的方法是实例方法,重写时不可以用static修饰。
(3) 如果子类可以继承父类的方法,子类就有权利重写这个方法,子类通过重写父类的方法
可以改变父类的具遗体行为。
5.实验后的练习: People类中的
public void speakHello() public void averageHeight() public void averageWeight()
三个方法的方法体中的语句是否可以省略。 答:可以省略,因为省略后结果没有变化
实验2:银行计算利息 1.实验要求:
假设银行bank已经有了按整年year计算利息的一般方法,其中year只能取正整数。比如,按整年计算的方法:
Double computerInternet(){
Interest=year**saveMoney; Return interest; }
建设银行constructionBank是bankde 子类,准备隐藏继承的成员变量year,并重写计算利息的方法,即自己声明一个double型的year变量。要求constructionbank和bankofDalian类是bank类的子类,constructionbank和bankofdalian都使用super调用隐藏的按整年计算利息的方法。
2.实验代码: 验结果:
4.实验分析:
(1) 子类不继承父类的构造方法,因此子类在其构造方法中需使用super来调用父类的
构造方法,并且super必须是子类构造方法中的头一条语句。
(2) 当super调用被隐藏的方法时,该方法中出现的成员变量是被子类隐藏的成员变量
或继承的成员变量。
5.实验后的练习:
参照建设银行或大连银行,在编写一个商业银行,让程序输出8000元存在商业银行8年零236天的利息。 验要求:
要求有一个abstract类,类名为Employee。Employee的子类有YearWorker、MonthWorker、WeekWorker。YearWorker对象按年领取薪水,MonthWorker按月领取薪水、WeekWorker按周领取的薪水。Employee类有一个abstract方法: public abstract earnings();
子类必须重写父类的earings()方法,给出各自领取报酬的具体方式。
有一个Company类,该类用Employee对象数组作为成员,Employee对象数组的单元可以是YearWorker对象的上转型对象、MonthWorker独享的上转型独享或weekworker对象的上转型独享。程序能输出Company对象一年需要支付的薪水总额。
2.实验代码:
abstract class Employee{
public abstract double earnings(); }
class YearWorker extends Employee{ public double earnings(){ return 12000; } }
class MonthWorker extends Employee{ public double earnings(){ return 12*2300; } }
class WeekWorker extends Employee{ public double earnings(){ return 52*780; } }
class Company{
Employee[] employee; double salaries=0;
Company(Employee[] employee){ =employee; }
public double salariesPay(){ salaries=0;
for(int i=0;i<;i++){
salaries=salaries+employee[i].earnings(); }
return salaries; } }
public class CompanySalary{
public static void main(String args[]){ Employee[] employee=new Employee[29]; for(int i=0;i<;i++){ if(i%3==0)
employee[i]=new WeekWorker(); else if(i%3==1)
employee[i]=new MonthWorker(); else if(i%3==2)
employee[i]=new YearWorker(); }
Company company=new Company(employee); \"公司薪水总额:\"+()+\"元\"); } }
3.实验结果:
4.实验分析:
尽管abstract类不能创建对象,但abstract类声明的对象可以存放子类对象的引用,即成为子类对象的上转型对象。
5.实验后的练习:
(1) 子类yearworker如果不重写earnings()方法,程序编译是提示怎么样的错误。 YearWorker 不是抽象的,并且未覆盖 Employee 中的抽象方法 earnings() class YearWorker extends Employee{
(2) 在增加一种雇员,并计算公司一年的总薪水。 class DayWorker extends Employee{ public double earnings(){ return 365*100; } }
将for语句改写为: for(int i=0;i<;i++){ if(i%4==0)
employee[i]=new WeekWorker(); else if(i%4==1)
employee[i]=new MonthWorker(); else if(i%4==2)
employee[i]=new YearWorker(); else if(i%4==3)
employee[i]=new DayWorker(); }