编写一个模拟电信收取电话费的应用程序,要求定义一个抽象类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());
}
}