概述
题目内容:
3.1 第一步:设计和实现以下类
(1)手机卡类 特征:卡类型、卡号、用户名、密码、账户余额、通话时长(分钟)、上网流量 行为:显示(卡号 + 用户名 + 当前余额)
(2)通话套餐类 特征:通话时长、短信条数、每月资费 行为: 显示所有套餐信息
(3)上网套餐类 特征:上网流量、每月资费 行为:显示所有套餐信息
(4)用户消费信息类 特征:统计通话时长、统计上网流量、每月消费金额
3.2 第二步:设计和实现以下枚举类 手机卡的类型总共有 3 种:大卡、小卡、微型卡
3.3 第三步:实体类的优化 将通话套餐类和上网套餐类中相同的特征和行为提取出来组成抽象套餐类。
3.4 第四步:创建并实现以下接口
(1)通话服务接口 抽象方法: 参数1: 通话分钟, 参数2: 手机卡类对象 让通话套餐类实现通话服务接口。
(2)上网服务接口 抽象方法: 参数1: 上网流量, 参数2: 手机卡类对象 让上网套餐类实现上网服务接口。
3.5 第五步:进行代码测试
编写测试类使用多态格式分别调用上述方法,方法体中打印一句话进行功能模拟即可。
思路分析:
1、首先有两个类
通话套餐类: 通话时长,通话单价,短信条数,打印套餐信息
上网套餐类:上网流量,流量单价,打印套餐信息
2、二者提取公共特征和行为做公共类,所以公共类的构成就是
特征:时长data和单价price
方法:打印套餐信息show()
由于两个子类中的show并不相同,因此将公共类中的show做抽象方法,公共类做成一个抽象类
3、这样两个子类继承了父类 中的特征,并重写show方法,分别打印自己的套餐信息
对三个类进行封装和重写
4、之后设置2个接口通话接口和上网接口,表示记录通话和上网的,动态的记录,消费还有通话上网时长等动态信息记录,有抽象方法为server
两个子类分别继承这两个接口,重写server方法,将其具体化
5、最后创建一个枚举类,表示手机卡类型,有大卡小卡和微型卡
6、此时一个抽象类,两个接口,两个具体实现的类已全部完成
7、接着创建一个手机卡的类,表示手机卡的所有属性
一个消费者类,表示消费的统计,变量有通话时长,流量,和总消费额
8、最后,将所有的类的show方法和server方法补充完整,在编写代码的过程中遇到的难点是变量值的修改,有点饶头,需要理清思路。
具体实现:
//Package.java
抽象类中,
成员变量:消费的量data 和 单价price
抽象方法:打印show方法
public abstract class Package {
//成员变量 data price 套餐的单价和个数
private int data;
private int price;
//无参构造
public Package() {
}
//有参构造
public Package(int data, int price) {
setPrice(price);
setData(data);
}
//get和set方法
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
//抽象成员方法:打印套餐信息
数据data
单价price
public abstract void show();
}
NetServer.java 和CallServer.java
接口
public interface NetServer {
//上网记录 变量有上网流量和手机卡
public abstract void server(int data,PhoneCard pc);
}
public interface CallServer {
//通话记录
变量有手机卡和通话时长
public abstract void server(int time,PhoneCard pc);
}
CallPackage.java 和 NetPackage.java
具体实现类 继承了抽象类和接口
分别重写了show方法和server方法
show方法:打印上网套餐和通话套餐的数据
server:修改上网流量和通话时长的值,最后修改一下手机卡余额
//通话套餐有三个成员变量,分别是通话时长、通话单价和短信条数
//其中通话时长和通话单价继承自父类,短信条数来自本类
//有两个成员方法,分别是show和server,都是重写后的方法
//show来自Package父类,server来自CallServer接口
//show方法打印套餐的初始值,也就是通话套餐:通话时长为0分钟,通话单价为1元/分钟,短信条数为0条
//server方法统计的是总的通话时长、总的消费和手机余额
public class CallPackage extends Package implements CallServer{
//成员变量 data price message
private int message;
//构造方法
public CallPackage() {
}
public CallPackage(int data, int price, int message) {
super(data, price);
setMessage(message);
}
//get和set方法
public int getMessage() {
return message;
}
public void setMessage(int message) {
this.message = message;
}
//成员方法:show方法的重写 继承的Package套餐类
@Override
public void show(){
System.out.println("通话套餐:通话时长"+getData()+"分钟,通话资费"+getPrice()+"元/分钟,短信条数"+getMessage()+"条");
}
//成员方法:server方法的重写 继承的CallPackage接口
变量为通话时长和手机卡 要用到手机卡里的余额
@Override
public
void server(int time,PhoneCard pc){
int a=time+getData();
//总的通话时长
setData(a);
//修改通话时长
pc.setCardBalance(pc.getCardBalance()-time*getPrice());
}
}
//上网套餐有两个成员变量,上网流量和流量单价,都继承自父类Package
//有两个成员方法,show方法和server,都是重写方法
//show方法,重写父类中的show方法,打印上网套餐的属性,用了多少流量和流量的单价
//server方法,重写接口中的server,修改的是手机卡余额和上网总流量
public class NetPackage extends Package implements NetServer{
//用了多少GB 每GB多少钱
public NetPackage() {
}
public NetPackage(int data, int price) {
super(data, price);
}
@Override
public void
show(){
System.out.println("上网套餐:上网流量"+getData()+"GB,流量单价"+getPrice()+"元/GB");
}
@Override
public void server(int data,PhoneCard pc) {
int a=data+getData();
//总的上网流量
setData(a);
//修改上网流量
pc.setCardBalance(pc.getCardBalance()-data*getPrice());
}
}
CardType.java
枚举类
//枚举类里构造方法必须私有
public enum CardType {
BIG("大卡"),SMALL("小卡"),MINI("微型卡");
private final String type;
CardType(String type) {
this.type = type;
}
public String getType(){
return type;
}
}
PhoneCard.java
手机卡类 显示手机卡的所有属性
show:显示3项
showAll:显示多项
//手机卡的类
主要描述了手机卡里有的特征
public class PhoneCard {
//私有变量
private String cardType;
private String cardID;
private String cardName;
private String cardPassword;
private int cardBalance;
//余额
private int cardTime;
//通话时长
private int cardData;
//上网流量
//构造方法
public PhoneCard() {
}
public PhoneCard(String cardType, String cardID, String cardName,
String cardPassword, int cardBalance, int cardTime,
int cardData) {
setCardType(cardType);
setCardID(cardID);
setCardName(cardName);
setCardPassword(cardPassword);
setCardBalance(cardBalance);
setCardTime(cardTime);
setCardData(cardData);
}
//get和set方法
public String getCardType() {
return cardType;
}
public void setCardType(String cardType) {
this.cardType = cardType;
}
public String getCardID() {
return cardID;
}
public void setCardID(String cardID) {
this.cardID = cardID;
}
public String getCardName() {
return cardName;
}
public void setCardName(String cardName) {
this.cardName = cardName;
}
public String getCardPassword() {
return cardPassword;
}
public void setCardPassword(String cardPassword) {
this.cardPassword = cardPassword;
}
public int getCardBalance() {
return cardBalance;
}
public void setCardBalance(int cardBalance) {
this.cardBalance = cardBalance;
}
public int getCardTime() {
return cardTime;
}
public void setCardTime(int cardTime) {
this.cardTime = cardTime;
}
public int getCardData() {
return cardData;
}
public void setCardData(int cardData) {
this.cardData = cardData;
}
//打印所有信息
public void showAll(){
System.out.println("账号类型:"+getCardType());
System.out.println("账号:"+getCardID());
System.out.println("用户名:"+getCardName());
System.out.println("密码:"+getCardPassword());
System.out.println("账号余额:"+getCardBalance());
System.out.println("通话时长:"+getCardTime());
System.out.println("上网流量:"+getCardData());
}
public void show(){
System.out.println("账号:"+getCardID());
System.out.println("用户名:"+getCardName());
System.out.println("账号余额:"+getCardBalance());
}
}
UserInfo.java
统计消费的总额,有三个变量,通话时长、上网流量和总消费额
有一个show方法打印这三个值,在show方法里,对于这三个值进行了计算,show方法的形参是两个套餐类型的参数
//计算用户的上网流量 通话时长 总消费额
public class UserInfo {
private int userTime;
private int userData;
private int userPrice;
public UserInfo() {
}
public UserInfo(int userTime, int userData, int userPrice) {
setUserData(userData);
setUserPrice(userPrice);
setUserTime(userTime);
}
public int getUserTime() {
return userTime;
}
public void setUserTime(int userTime) {
this.userTime = userTime;
}
public int getUserData() {
return userData;
}
public void setUserData(int userData) {
this.userData = userData;
}
public int getUserPrice() {
return userPrice;
}
public void setUserPrice(int userPrice) {
this.userPrice = userPrice;
}
public void show(CallPackage cp,NetPackage np){
setUserTime(cp.getData());
setUserData(np.getData());
setUserPrice(cp.getData()*cp.getPrice()+np.getData()*np.getPrice());
System.out.println("消费记录:通话时长"+getUserTime()+"分钟 上网流量"+getUserData()+"GB 消费"+getUserPrice()+"元");
}
}
test.java
最后终于来到了测试类。。。
创建手机卡类、消费类、套餐类的对象
public class test {
public static void main(String[] args) {
System.out.println("=================初始手机卡信息=================");
PhoneCard pc =new PhoneCard(CardType.BIG.getType(),"17853132258",
"qiqi","666666",1000,0,0);
pc.showAll();
System.out.println("=================初始套餐信息=================");
CallPackage cp = new CallPackage(0,1,0);
NetPackage np = new NetPackage(0,1);
cp.show();
np.show();
System.out.println("================开始消费=====================");
UserInfo ui =new UserInfo();
System.out.println("=================通话后=====================");
cp.server(20,pc);
pc.show();
cp.show();
ui.show(cp,np);
System.out.println("=================上网后=====================");
np.server(200,pc);
pc.show();
np.show();
ui.show(cp,np);
System.out.println("=================再一次上网后=====================");
((NetPackage) np).server(200,pc);
pc.show();
np.show();
ui.show(cp,np);
}
}
结果如下:
=================初始手机卡信息=================
账号类型:大卡
账号:17853132258
用户名:qiqi
密码:666666
账号余额:1000
通话时长:0
上网流量:0
=================初始套餐信息=================
通话套餐:通话时长0分钟,通话资费1元/分钟,短信条数0条
上网套餐:上网流量0GB,流量单价1元/GB
================开始消费=====================
=================通话后=====================
账号:17853132258
用户名:qiqi
账号余额:980
通话套餐:通话时长20分钟,通话资费1元/分钟,短信条数0条
消费记录:通话时长20分钟 上网流量0GB 消费20元
=================上网后=====================
账号:17853132258
用户名:qiqi
账号余额:780
上网套餐:上网流量200GB,流量单价1元/GB
消费记录:通话时长20分钟 上网流量200GB 消费220元
=================再一次上网后=====================
账号:17853132258
用户名:qiqi
账号余额:580
上网套餐:上网流量400GB,流量单价1元/GB
消费记录:通话时长20分钟 上网流量400GB 消费420元
在这个全部代码中也出现了一些问题,比如说在打印的时候并没有用到多态的思想,主要是自己对多态的思想还没有体会的很好,理解的也没有很好,不知道该如何体现多态,总之就先这样。。。
最后
以上就是矮小香烟为你收集整理的实现手机卡套餐一系列的类的封装的全部内容,希望文章能够帮你解决实现手机卡套餐一系列的类的封装所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复