当前位置:课程学习>>第四章 面向对象基础>>实践活动




同学们,实践是检验真理问题的唯一标准,运用你们学到的知识实践检验一下能力提升了吗?

实践主题1:上转型对象

实践目标1:掌握上转型对象的使用。上转型即把子类创建的对象的引用放到一个父类的对象中时,得到该对象的一个上转型对象,那么这个上转型对象在调用方法时就可能具有多种形态,不同对象的上转型对象调用同一方法可能产生不同的行为。

实践任务1:按模板要求,将[代码]处替换为Java程序代码

实践要求1:有一个abstract类,类名为Employee,其子类有YearWorker、MonthWorker、WeekWorker。YearWorker对象按年领取薪水,MonthWorker按月领取薪水、WeekWorker按周领取薪水。Employee类有一个abstract方法:public abstract earnings();子类必须重写父类的earnings()方法,给出各自领取报酬的具体方式。

有一个Company类,该类用Employee数组作为成员,Employee数组的单元可以是YearWorker对象的上转型对象、MonthWorker对象的上转型对象或WeekWorker对象的上转型对象。程序能输出Company对象一年需要支付的薪水总额。

HardWork.java

 abstract class Employee {

  public abstract double earnings();

}

 class YearWorker extends Employee {

  [代码1] //重写earnings()方法

 }

 class MonthWorker extends Employee {

  [代码2] //重写earnings()方法

 }

 class WeekWorker extends Employee {

  [代码3] //重写earnings()方法

 }

 class Company {

  Employee[] employee;

  double salaries=0;

  Company(Employee[] employee) {

   this.employee=employee;

  }

 public double salariesPay() {

  salaries=0;

  [代码4] //计算salaries

  return salaries;

 }

}

public class HardWork {

 public static void main(String[] args) {

  Employee[] employee=new Employee[20];

   for(int i=0;i<employee.length;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);

  System.out.println("公司年工资总额:"+company.salariesPay());

 }

}

教师分析:

这个实践主要是加强对上转型对象的掌握。程序考核的是输出语句的使用。参考代码如下:

public double earnings(){         //[代码1]重写earnings()方法

   double earnings=80000.0;

   return earnings;

 }   

   public double earnings(){         // [代码2]重写earnings()方法

   double earnings=4000.0;

   return earnings;

 }     

public double earnings(){         //[代码3]重写earnings()方法

   double earnings=500.0;

   return earnings;

 }       

salaries=salaries+employee[i].earnings();//[代码4]

 

实践主题2:接口回调

实践目标2:掌握接口回调技术

实践任务2:按模板要求,将[代码]处替换为Java程序代码

实践任务2:有一个ComputeTotalSales接口,该接口中有一个方法:public double totalSalesByYear()

有三个实现该接口的类Television、Computer和Mobile,这三个类通过实现接口ComputeTotalSales,给出自己的年销售额。

有一个Shop类,该类用ComputeTotalSales数组作为成员,ComputeTotalSales数组的单元可以存放Television对象的引用、Computer对象的引用或Mobile对象的引用。程序能输出Shop对象的年销售额。

HappySale.java

 interface ComputeTotalSales {

  public double totalSalesByYear();

}

  class Television implements ComputeTotalSales {

   [代码1] //实现totalSalesByYear()方法

}

  class Computer implements ComputeTotalSales {

   [代码2] //实现totalSalesByYear()方法

}

  class Mobile implements ComputeTotalSales {

   [代码3] //实现totalSalesByYear()方法

}

  class Shop {

   ComputeTotalSales[] goods;

   double totalSales=0;

   Shop(ComputeTotalSales[] goods) {

    this.goods=goods;

   }

   public double giveTotalSales() {

    totalSales=0;

    [代码4] //计算totalSales

    return totalSales;

  }

}

public class HappySale {

 public static void main(String[] args) {

  ComputeTotalSales[] goods=new ComputeTotalSales[50];

  for (int i=0;i<goods.length;i++) {

   if(i%3==0)

    goods[i]=new Television();

   if(i%3==1)

    goods[i]=new Computer();

   if(i%3==2)

    goods[i]=new Mobile();

 }

   Shop shop=new Shop(goods);

   System.out.println("商店年销售额: "+shop.giveTotalSales());

 }

}

教师分析:   

这个实践主要是加强对接口回调的掌握。程序考核的是输出语句的使用。参考代码如下:

public double totalSalesByYear(){

    return 30000.0;

}          //[代码1]实现totalSalesByYear()方法

public double totalSalesByYear(){

   return 40000.0;

}          //[代码2]实现totalSalesByYear()方法

public double totalSalesByYear(){

   return 50000.0;

}          //[代码3]实现totalSalesByYear()方法

totalSales=totalSales+goods[i].totalSalesByYear();// [代码4]

 

实践主题3:三角形类的封装

实践目标3:使用类来封装对象的属性和功能

实践要求3:编写一个Java应用程序,该程序中有1个类:Trangle,用来刻画“三角形”,具体要求如下:Trangle类具有类型为double的三个边属性,Trangle类具有返回周长、面积以及修改三个边的功能。另外,Trangle类还具有一个boolean型的属性,该属性用来判断三个数能否构成一个三角形。

教师分析:

这个实践主要是加强对类封装的掌握。参考代码如下:

//AreaAndLength.java

  class Trangle //三角形类

{

  double sideA,sideB,sideC;

  boolean isTrangle;

  public Trangle(double a,double b,double c) //构造方法

  {

   sideA=a;

   sideB=b;

   sideC=c;

   if( (a+b>c) && (a+c>b) && (b+c>a)) //构成三角形的条件

   isTrangle =true;

   else

   isTrangle =false;

 }

 double getLength() //计算length的值

 {

   if(boo)

   return (sideA+sideB+sideC);

   else

   {

     System.out.println("不是一个三角形,不能计算周长");

     return 0;

   }

  }

public double getArea() //计算面积

{

 if (sTrangle)

 {

   double p=(sideA+sideB+sideC)/2.0;

   return Math.sqrt(p*(p-sideA)*(p-sideB)*(p-sideC));

 }

 else

 {

   System.out.println("不是一个三角形,不能计算面积");

   return 0;

 }

}

public void setABC(double a,double b,double c)//设置三角形的边

{

   sideA=a;

   sideB=b;

   sideC=c;

   if( (a+b>c) && (a+c>b) && (b+c>a) )

    isTrangle =true;

   else

    isTrangle =false;

  }

 }

 public class AreaAndLength

 {

  public static void main(String[] args)

 {

   double length,area;

   Trangle trangle=new Trangle(3,4,5); //创建对象trangle

   length=trangle.getLength(); //计算周长

   System.out.println("三角形的周长:"+length);

   area=trangle.getArea(); //计算面积

   System.out.println("三角形的面积:"+area);

   trangle.setABC(10,20,5);

   area=trangle.getArea(); //计算面积

   System.out.println("三角形的面积:"+area);

   length=trangle.getLength(); //计算周长

   System.out.println("三角形的周长:"+length);

 }

}

进入拓展资源