您的位置: 网站首页 > 程序开发 > Java程序设计 > 第7章 面向对象的高级特性 > 【7.4 上 机 实 验】

7.4 上 机 实 验

 

7.4 

编写一个模拟电信收取电话费的应用程序,要求定义一个抽象类Telephone来存储电话的公用数据,包括电话号码、开通的服务模式(本地、国内途和国际长途)和结算金额。然后用重载技术定义FixedTelephone类的4个构造方法,使用继承和重载技术定义OrdinaryPhone类的两个构造方法。使用覆盖技术在OrdinaryPhone类中覆盖父类的getBalance()方法以及Object类的toString()方法。主类中创建类的对象myHomePhone时,使用构造方法对大部分的域都进行初始化。

程序的代码如下。

/** Telephone.java @author ZDS

 * 2007-2-20 下午22:40:58 */

packagechap07;

/** 电话抽象类*/

abstract public class Telephone {

    long phoneNumber;    // 存储电话号码

    final int local_Call=1;  // 本地呼叫

    final int distance_Call=3;   // 国内长途

    final int international_Call=9;  // 国际长途

    double balance;      // 结算金额

   

    // 按照指定模式收费,此函数每分钟执行一次,扣除金额。如果金额不足,则返回false

    abstract boolean chargeMode (int call_Mode ) ;

   

    // 返回剩余金额

    double getBalance ( ){

        return balance ;

    }

}

/** FixedTelephone.java @author ZDS

 * 2007-2-20 下午23:12:28 */

package chap07;

/** 固定电话抽象类,继承于电话类*/

abstract public class FixedTelephone extends Telephone {

    double monthFee;// 每月座机费

   

    FixedTelephone( ) { }

    FixedTelephone (long pn) {

        this();

        phoneNumber = pn;

    }

    FixedTelephone(long pn, double mf ) {

        this (pn);

        monthFee = mf;

    }

    FixedTelephone(long pn ,double mf ,double b) {

        this (pn,mf);

        balance = b;

    }

}

/** OrdinaryPhone.java @author ZDS

 * 2007-2-20 下午23:12:28 */

package chap07;

/** 普通电话类,继承于固定电话类*/

public class OrdinaryPhone extends FixedTelephone {

    boolean longdistanceService;// 是否开通国内长途业务

    boolean internationalService;    // 是否开通国际长途业务

   

    OrdinaryPhone (long pn,double mf,boolean a){

        super (pn, mf);

        longdistanceService = a;

    }

    OrdinaryPhone(long pn,double mf,double b,boolean a){

        super (pn ,mf, b);

        longdistanceService = a ;

    }

    // 实现收费接口函数

    boolean chargeMode (int call_Mode ) {

        if (call_Mode == distance_Call

            &&!longdistanceService) return false;

        if (call_Mode == international_Call

            &&!internationalService) return false;

                                // 检查国内长途和国际长途服务是否开通

        if (balance > (0.2 * call_Mode) ){

            balance -= (0.2 * call_Mode) ;

            return true;

        } else

            return  false;

    }

    // 根据打折来收费

    boolean chargeMode (int call_Mode, boolean discount_time ){

        if (discount_time){                  // 如果是在打折的时间

            return  chargeMode(call_Mode/2);

        } else

            return  chargeMode(call_Mode);    // 正常时间的计费方式

    }

    double getBalanee ( ){

        if (balance > monthFee )

            return balance - monthFee;

        else

            return -1 ;

    }

    public String toString( ) {

        String yn = longdistanceService ? "":"";

        return ( "电话号码为:"+phoneNumber

                  +"\n 每月座机费:"+monthFee

                  +"\n 剩余金额:"+balance

                  +"\n 可通国内长途:"+yn);

    }

}

/** OrdinaryPhone.java @author ZDS

 * 2007-2-20 下午23:32:11 */

package chap07;

public class SumaryExample {

    public static void main(String args[]){

        OrdinaryPhone myHomePhone =

            new OrdinaryPhone(87688888, 25.0, 100.0, true);

       

        myHomePhone.chargeMode(1);   // 测试收费

        System.out.println(myHomePhone.toString());

    }

}