实验五 java继承与多态
一、实验目的:
掌握继承、多态的概念与实现方法; 掌握包和接口的定义和使用方法; 了解JAVA语言实现多继承的途径; 二、实验要求:
1. 能实现类的继承关系;
2. 用多种方法创建各个类的对象;
3. 程序应包括各个被调用方法的执行结果的显示。
4. 写出实验报告。要求记录编译和执行Java程序当中的系统错误信息提示,并给出解决办法。(附运行界面、源代码)。 四、实验步骤: 1、继承在教材例题中的应用
2、多态在工资系统中的应用
下面给出一个根据雇员类型利用abstract方法和多态性完成工资单计算的程序。 Employee是抽象类,Employee的子类有Boss(每星期发给他固定工资,而不计工作时间)、 CommissionWorker(除基本工资外还根据销售额发放浮动工资)、PieceWorker(按其生产的产品数发放工资)、HourlyWorker(根据工作时间长短发放工资)。该例的Employee的每个子类都声明为final,因为不需要再继承它们生成子类。
对所有雇员类型都使用earnings()方法,但每个人挣的工资按他所属的雇员类计算,所有雇员类都是从超类Earnings()派出生的。所有在超类中声明earnings()为抽象方法,并且对于每个子类都提供恰当的earnings()的实现方法。为了计算雇员的工资,程序仅仅使用雇员对象的一个超类引导 并调用earnings()方法。在一个实际的工资系统中,各种Employee对象的引用可以通过一个Employee引用数组来实现。程序依次使用数组的每个元素(Employee引用)调用每个对象的employee()方法。
(1)编辑Test.java,设保存在D:\\myjava目录下。 //Employee超类的定义 abstract class Employee {
private String firsrName; private String lastName;
public Employee(String first,String last) {
firstName=first; lastName=last; }
public String getEmployeeName()
1
{
return firstName;
}
publicString getLastName() {
return lastName: }
public String toString() {
return firstName+lastName; }
public absteac double earnings();
}
//定义Boss类,为Employee的子类 final class Boss extends Employee {
private double weeklySalary;
public Boss(String frist,string lasr,double s) {
super(first,last); setWeeklySalary(s); }
public woid setWeeklySalary(double s) {
weeklySalary=(s>0?s:o\\0); }
public double earnings() {
return “Boss”+super.roString(); } }
//定义CommissiomWorker类,为Employee的子类 final class CommissionWorker extends Employee {
private double salary;
private double commission; private int quantity;
public CommissionWorker(String first,String last,double s,double c,int q) {
super(frist,last); setSalary(s);
setCommission(c); setQuantit(q); }
2
public voids setQusntily(double s) {
salary=(s>0?q:0); }
public double setCommission(double c) {
commission=(c>0?c:0); }
public double earnings() {
return salsry+commission+quantity; }
pulic String toString() {
return“CommissionWorker”+super.tostring(); } }
//定义PieceWorker类,为Employee的子类 final class PieceWorker extends Employee {
private double wagePiece; private int quantity;
public PieceWorker(String first,String last,double w,int q) {
super(first,last); setWage(w); setQuantity(q;) }
public void setWage(double w) {
wagePerPiece=(w>0?w:0); }
public void setQuantity(int q) {
return quantity+wafePerPiece; }
public String toString() {
return “PieceWoeker”+super.toString(); } }
定义HourlyWorker类,为Employee的子类 class HourlyWorker extends Employee {
3
private double wage; prvate double hours;
public HourlyWorker(String first,String last ,double w,double h) {
super(first,last); setWage(w); serHouts(h); }
public void setWage (double w) {
wage=(w>0?w:o); }
public void setHours(double h) {
hours=(h>=0&&h<168?h:0); }
public double earnings() {
return “HourlyWorker”+super.toString(); } }
class Text {
public static void main(string args[ ]) {
//使用超类声明ref Employee ref;
String output=“”; //分别定义各子类
Boss b=new Boss(“Hohn”,“Smith”,800.00);
CommissionWorker c=new CommissionWorker(“Sue”,“Hones”,400.00,3.0,150); PieceWorker p=new PieceWorker(“Bob”,“Lewis”,2.5,200);
HourlyWorker h=new HourlyWorker(“Karen”,“price”,13.75,40);
//使用子类分别实例化 ref=b;
out+=ref.toString()+“earned $”+ref.earnings+“\\n”+b.toString()+“earned $”+b.earnings+“\\n”; System.out.print(output); ref=c;
out+=ref.toString()+“earned $”+ref.earnings+“\\n”+c.toString()+“earned $”+c.earnings+“\\n”; System.out.print(output); ref=p;
out+=ref.toString()+“earned $”+ref.earnings+“\\n”+p.toString()+“earned $”+p.earnings+“\\n”; System.out.print(output); ref=h;
4
out+=ref.toString()+“earned $”+ref.earnings+“\\n”+h.toString()+“earned $”+h.earnings+“\\n”; System.out.print(output); }
}
⒊ 包的建立与使用
(1) 编辑Calculate.java,设保存在D:\\myjava目录下。 package mypackage; public class Calculate {
private int a;
public Calculate(int a) {this.a=a;
System.out.printl(“from constrartion”+this.a); }
public double volume(double height,double width,doule depth) {
return height*width*depth; }
int add(int x, int y) {
return x+y; }
protected void a() {
System .out.println(“from constration”+a); } }
编译,查看D:\\myjava目录下是否生成了myoackage文件夹,在该文件夹中是否有Calculate.class文件。
(2) 编辑Interfaceclass.java,设保存在D:\\myjava目录下。 import mypackage.Calculate; class PackageDemo {
public static void main(string ags[ ]) {
Calculate c=new Calculate(10); double s=c.volume(5,6,7); System.out.println(s); //int b=c.add(5,6); //c.a(); } }
5
3.定义抽象类Shape,抽象方法为showArea(),求出面积并显示,定义矩形类Rectangle,正方形类Square,圆类 Circle,根据各自的属性,用showArea方法求出各自的面积,在main方法中构造3个对象,调用showArea方法。
定义接口DiagArea,其中包含方法double getDiagonal()求对角线长, double getArea()求面积,定义一个矩形类,实现此接口,并自行扩充成员变量和方法,定义一个正方形类继承矩形类(如矩形有长w和宽h,正方形有边x,并有相应的构造函数,有一个方法中一次直接显示边长、面积和对角线长),在另一类中的主方法里使用测试该类。
4.(第3题)定义抽象类Shape,抽象方法为showArea(),再定义矩形类Rectangle,正方形类Square,圆类 Circle,和各自的属性。定义主类、主方法,在main方法中构造3个对象,调用showArea方法;定义接口DiagArea,其中包含方法double getDiagonal(),在主main方法中输出方法执行结果。 六、自做作实验
1.定义一个描述人的基本类,该类包括人的性别和出生日期两个数据成员,以及设置和获取这些属性值的方法成员;再定义一个大学生类,使大学生类具有人的所有属性外,还具有姓名、学号,大学入学成绩,籍贯属性以及设置和获取这些属性值的方法成员;编写完整的程序,完成一个具有班级学生信息管理功能的程序。
2创建一个接口Shape,其中有抽象方法area,类Circle 、Rectangle实现area方法计算其面积并返回。又有Star实现Shape的area方法,其返回值是0,Star类另有一返回值boolean型方法isStar;在main方法里创建一个Vector,根据随机数的不同向其中加入Shape的不同子类对象(如是1,生成Circle对象;如是2,生成Rectangle对象;如是3,生成Star对象)。然后将Vector中元素依次取出,判断其是否为Star类。如是返回其是个Star。否则返回其面积。
3..学校中有老师和学生两类人,而在职研究生既是老师又是学生,对学生的管理和对教师的管理在他们身上都有体现。
6
1)设计两个信息管理接口StudentManageInterface和TeacherManageInterface。其中,StudentInterface接口包括setFee()方法和getFee()方法,分别用于设置和获取学生的学费;TeacherInterface接口包括setPay()方法和getPay()方法,分别用于设置和获取教师的工资
2) 定义一个研究生类Graduate,实现StudentInterface接口和TeacherInterface接口,它定义的成员变量有name(姓名)、sex(性别)、age(年龄)、fee(每学期学费)、pay(月工资)。
3) 创建一个姓名为“zhangsan”的研究生,统计他的年收入和学费,如果收入减去学费不足2000元,则输出“provide a loan”(需要贷款)信息。 提示:
1)定义两个接口,分别在其中申明两个方法。 2)定义主类Graduate,实现这两个接口。 3)定义主类的成员变量,和构造方法。 4)给出四个接口方法的实现。
5)给出一个计算是否需要贷款的方法,在里面统计年收入和学费,并输出是否需要贷款的信息。
6)写main方法。在其中创建一个姓名为“zhangsan”的研究生,调用计算是否需要贷款的方法。
7