java面向对象和高级特性项目实战

小余上岸      2022-05-03     560

关键词:

一、项目简介

  • 项目名:嗖嗖移动业务大厅

  • 技能点:

  

二、技能点 

  

三、系统概述

  

四、整体开发思路

  

五、实体类和接口开发

   

   

六、 创建工具类

  

七、使用集合存储数据

  

八、开发计划

  

九、代码实现  

  1.项目目录

  

  2.具体代码

  • 测试类
package cn.soso.biz;

import java.util.Scanner;

import cn.soso.entity.MobileCard;
import cn.soso.entity.ServicePackage;
import cn.soso.utils.CardUtil;

/**
 * 业务类
 *
 * @author yu
 *
 */
public class SosoMgr {
    Scanner input = new Scanner(System.in);
    CardUtil utils = new CardUtil();

    public static void main(String[] args) {
        SosoMgr soso = new SosoMgr();
        soso.mainMenu();
        System.out.println("谢谢使用!");
    }

    /**
     * 主流程
     */
    public void mainMenu() {
        int menuChoose = 0;
        String mobileNumber= "";
        String password = "";
        utils.init();
        utils.initScenes();
        //Common.typesInit();
        do {
            System.out.println("\n*************欢迎使用嗖嗖移动业务大厅***************");
            System.out.println("1.用户登录   2.用户注册   3.使用嗖嗖   4.话费充值  5.资费说明  6.退出系统");
            System.out.print("请选择:");
            menuChoose = input.nextInt();
            // 分支语句:根据功能编号执行相应功能
            switch (menuChoose) {
                case 1:
                    //用户登录
                    System.out.print("请输入手机卡号:");
                    mobileNumber = input.next();
                    System.out.print("请输入密码:");
                    password = input.next();
                    if (utils.isExistCard(mobileNumber, password)) {
                        cardMenu(mobileNumber);
                    }else{
                        System.out.println("对不起,您输入的信息有误,无法登录!");
                    }
                    continue;
                case 2:
                    //用户注册
                    registCard();
                    continue;
                case 3:

                    //使用嗖嗖
                    System.out.print("请输入手机卡号:");
                    mobileNumber = input.next();

                    if (utils.isExistCard(mobileNumber)) {
                        try {
                        /*System.out.println("****使用之前****");
                        cn.soso.utils.showRemainDetail(mobileNumber);
                        cn.soso.utils.showAmountDetail(mobileNumber);*/
                            utils.userSoso(mobileNumber);
                        } catch (Exception e) {
                            System.err.println(e.getMessage());
                        }
                    }else{
                        System.out.println("对不起,该卡号未注册,不能使用!");
                    }

                /*System.out.println("****使用之后****");
                cn.soso.utils.showRemainDetail(mobileNumber);
                cn.soso.utils.showAmountDetail(mobileNumber);*/
                    continue;
                case 4:
                    //话费充值
                    System.out.print("请输入充值卡号:");
                    mobileNumber = input.next();
                    if (utils.isExistCard(mobileNumber)) {
                        System.out.print("请输入充值金额:");
                        double money = input.nextDouble();
                        utils.chargeMoney(mobileNumber, money);
                    }else{
                        System.out.println("对不起,要充值的卡号未注册,无法充值!");
                    }
                    continue;
                case 5:
                    System.out.println("\n*****资费说明******");
                    utils.showDescription();
                    continue;
                case 6:
                    //退出系统
                    break;
                default:
                    //选择其他数字退出系统
                    break;
            }
            break;
        } while (true);
    }

    /**
     * 手机卡功能菜单
     *
     * @param number
     * @return
     */
    public int cardMenu(String mobileNumber) {
        int menuChoose = 0;
        do {
            System.out.println("\n*****嗖嗖移动用户菜单*****");
            System.out.println("1.本月账单查询");
            System.out.println("2.套餐余量查询");
            System.out.println("3.打印消费详单");
            System.out.println("4.套餐变更");
            System.out.println("5.办理退网");
            System.out.print("请选择(输入1~5选择功能,其他键返回上一级):");
            menuChoose = input.nextInt();
            switch (menuChoose) {
                case 1:
                    System.out.println("\n*****本月账单查询******");
                    utils.showAmountDetail(mobileNumber);
                    continue;
                case 2:
                    System.out.println("\n*****套餐余量查询******");
                    utils.showRemainDetail(mobileNumber);
                    continue;
                case 3:
                    System.out.println("\n*****消费详单查询******");
                    utils.printConsumInfo(mobileNumber);
                    continue;
                case 4:
                    System.out.println("\n*****套餐变更******");
                    System.out.print("1.话唠套餐  2.网虫套餐  3.超人套餐  请选择(序号):");
                    utils.changingPack(mobileNumber, input.next());
                    continue;
                case 5:
                    System.out.println("\n*****办理退网******");
                    utils.delCard(mobileNumber);
                    System.out.println("谢谢使用!");
                    System.exit(1);     //办理退网后退出系统

            }

            break;
        } while (true);
        return menuChoose;
    }

    /**
     * 注册新卡流程
     */
    public void registCard(){
        String[] newNumbers = utils.getNewNumbers(9);
        //显示可供选择的手机号列表
        System.out.println("*****可选择的卡号*****");

        for(int i=0;i<9;i++){
            System.out.print((i+1)+"."+newNumbers[i]+"\t\t");
            if((i+1)%3==0){
                System.out.println();
            }
        }
        //选择手机号
        System.out.print("请选择卡号(输入1~9的序号):");
        String number = newNumbers[input.nextInt()-1];

        //选择套餐类型
        System.out.print("1.话唠套餐  2.网虫套餐  3.超人套餐,  ");
        System.out.print("请选择套餐(输入序号):");
        //cn.soso.utils.getPackList();
        //获取套餐对象
        ServicePackage pack = utils.createPack(input.nextInt());

        //输入用户名
        System.out.print("请输入姓名:");
        String name = input.next();

        //输入密码
        System.out.print("请输入密码:");
        String password = input.next();

        //输入预存话费金额
        double money = 0;
        System.out.print("请输入预存话费金额:");
        money = input.nextDouble();
        while(money<pack.getPrice()){
            System.out.print("您预存的话费金额不足以支付本月固定套餐资费,请重新充值:");
            money = input.nextDouble();
        }

        //创建新卡对象并添加
        MobileCard newCard = new MobileCard(name,password,number,pack,pack.getPrice(),money-pack.getPrice());
        utils.addCard(newCard);
    }
}

  • 公共类
package cn.soso.common;

import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.Map;

/**
 * 公共类
 * @author yu
 *
 */
public class Common {
    /**
     * double类型格式化
     * @param data
     * @return
     */
    public static String dataFormat(double data) {
        DecimalFormat formatData = new DecimalFormat("#.0");
        return formatData.format(data);
    }

    /**
     * double类型两数相减
     * @param num1
     * @param num2
     * @return
     */
    public static double sub(double num1,double num2){
        return (num1*10-num2*10)/10;
    }
}
package cn.soso.common;
/**
 * 消费类型
 * @author rong.zhou
 *
 */
public enum ConsumType {
   TALK,SMS,NETWORK
}
  • 实体类
package cn.soso.entity;
import cn.soso.common.ConsumType;
/**
 * 消费信息
 * @author yu
 *
 */
public class ConsumInfo {
    private String cardNumber;  //卡号
    private String type;  //消费类型:通话、发短信、上网
    private int consumData;   //消费数据   通话:分钟   发短信:条   上网:MB

    public ConsumInfo(){}
    public ConsumInfo(String cardNumber, String type, int consumData) {
        super();
        this.cardNumber = cardNumber;
        this.type = type;
        this.consumData = consumData;
    }
    public String getCardNumber() {
        return cardNumber;
    }
    public void setCardNumber(String cardNumber) {
        this.cardNumber = cardNumber;
    }
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
    public int getConsumData() {
        return consumData;
    }
    public void setConsumData(int consumData) {
        this.consumData = consumData;
    }
}
package cn.soso.entity;
/**
 * 手机卡
 * @author yu
 *
 */
public class MobileCard {
    private String cardNumber;  //卡号
    private String userName;  //用户名
    private String passWord;  //密码
    private ServicePackage serPackage;  //所属套餐
    private double consumAmount;  //当月消费金额
    private double money;  //账户余额
    private int realTalkTime;  //实际通话时长(分钟)
    private int realSMSCount;  //实际发送短信条数(条)
    private int realFlow;  //实际上网流量

    public MobileCard(){}

    public MobileCard(String userName, String passWord, String cardNumber,
                      ServicePackage serPackage, double consumAmount, double money) {
        super();
        this.userName = userName;
        this.passWord = passWord;
        this.cardNumber = cardNumber;
        this.serPackage = serPackage;
        this.consumAmount = consumAmount;
        this.money = money;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassWord() {
        return passWord;
    }

    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }

    public String getCardNumber() {
        return cardNumber;
    }

    public void setCardNumber(String cardNumber) {
        this.cardNumber = cardNumber;
    }

    public ServicePackage getSerPackage() {
        return serPackage;
    }

    public void setSerPackage(ServicePackage serPackage) {
        this.serPackage = serPackage;
    }

    public double getConsumAmount() {
        return consumAmount;
    }

    public void setConsumAmount(double consumAmount) {
        this.consumAmount = consumAmount;
    }

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }

    public int getRealTalkTime() {
        return realTalkTime;
    }

    public void setRealTalkTime(int realTalkTime) {
        this.realTalkTime = realTalkTime;
    }

    public int getRealSMSCount() {
        return realSMSCount;
    }

    public void setRealSMSCount(int realSMSCount) {
        this.realSMSCount = realSMSCount;
    }

    public int getRealFlow() {
        return realFlow;
    }

    public void setRealFlow(int realFlow) {
        this.realFlow = realFlow;
    }

    /**
     * 显示卡信息
     */
    public void showMeg(){
        System.out.println("卡号:"+this.cardNumber+" 用户名:"+this.userName+" 当前余额:"+this.money+"元。");
        this.serPackage.showInfo();
    }
}
package cn.soso.entity;

import cn.soso.common.Common;
import cn.soso.service.NetService;

/**
 * 网虫套餐
 *
 * @author yu
 *
 */
public class NetPackage extends ServicePackage implements NetService {
    private int flow; // 上网流量(MB)

    public NetPackage() {
        //套餐数据初始化
        this.flow = 1024 * 3;
        this.price = 68.0;
    }

    public NetPackage(int flow) {
        super();
        this.flow = flow;
    }

    public int getFlow() {
        return flow;
    }

    public void setFlow(int flow) {
        this.flow = flow;
    }



    @Override
    public void showInfo() {
        System.out.println("网虫套餐:上网流量是" + flow / 1024 + "GB/月,月资费是"
                + this.price + "元/月。");
    }

    /**
     * 提供上网服务
     */
    public void netPlay2(int flow, MobileCard card) throws Exception {
        int reminFlow = this.flow - card.getRealFlow();  //卡中可支付的免费流量
        // 判断套餐中的上网流量是否足够支付本次上网服务
        if (this.flow <= reminFlow) {
            // 套餐中上网流量足够:修改该卡实际上网流量数据
            card.setRealFlow(card.getRealFlow() + flow);
        } else {
            // 套餐中上网流量不够:额外消费需按0.1元/条付费,额外消费金额=0.1*(该卡实际消费上网流量+本次消费上网流量-套餐包含的上网流量)
            double consumeMoney = 0.1 * (flow-reminFlow);
            // 该卡账户余额足够支付:修改该卡实际使用的上网流量、账户余额、当月消费金额
            if (card.getMoney() >= consumeMoney) {
                //消耗的流量增加
                card.setRealFlow(card.getRealFlow() + flow);
                // 当前账户余额=当前账户余额-额外消费金额
                card.setMoney(card.getMoney() - consumeMoney);
                // 当月消费金额=当月消费金额+额外消费金额
                card.setConsumAmount(card.getConsumAmount() + consumeMoney);
            } else {

                int temp = (int)(card.getMoney()/0.1); //当前余额够大
                throw new Exception("您的余额不足,请充值后再使用!");
            }
        }
    }

    /**
     * 提供上网服务
     */
    public int netPlay(int flow, MobileCard card) throws Exception {
        int temp = flow;
        for(int i=0;i<flow;i++){
            if(this.flow-card.getRealFlow()>=1){
                //第一种情况:套餐剩余流量可以支持使用1M流量
                card.setRealFlow(card.getRealFlow()+1); //实际使用流量加1MB
            }else if(card.getMoney()>=0.1){
                //第二种情况:套餐流量已用完,账户余额可以支付1M流量,使用账户余额支付
                card.setRealFlow(card.getRealFlow()+1); //实际使用流量加1MB
                card.setMoney(Common.sub(card.getMoney(),0.1)); //账户余额消费0.1元(1M流量费用)
                card.setConsumAmount(card.getConsumAmount() + 0.1);
            }else{
                temp = i;
                throw new Exception("本次已使用流量"+i+"MB,您的余额不足,请充值后再使用!");
            }
        }
        return temp;
    }
}
package cn.soso.entity;
/**
 * 使用场景
 * @author yu
 *
 */
public class Scene {
    private String type;  //场景消费类型
    private int data;  //消费数据
    private String description;//场景描述

    public Scene(){}
    public Scene(String type,int data,String description){
        this.type = type;
        this.data = data;
        this.description = description;
    }

    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
    public int getData() {
        return data;
    }
    public void setData(int data) {
        this.data = data;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }

}
package cn.soso.entity;
/**
 * 嗖嗖移动卡套餐
 * @author yu
 *
 */
public abstract class ServicePackage {
    protected double price;  //套餐月资费(元)

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    //显示套餐数据
    public abstract void showInfo();
}
package cn.soso.entity;

import cn.soso.common.Common;
import cn.soso.service.CallService;
import cn.soso.service.NetService;
import cn.soso.service.SendService;

/**
 * 超人套餐
 * @author yu
 *
 */
public class SuperPackage extends ServicePackage implements CallService,
        SendService,NetService {
    private int talkTime;   //通话时长(分钟)
    private int smsCount;   //短信条数(条)
    private int flow;  //上网流量(MB)

    public int getTalkTime() {
        return talkTime;
    }


    public void setTalkTime(int talkTime) {
        this.talkTime = talkTime;
    }


    public int getSmsCount() {
        return smsCount;
    }


    public void setSmsCount(int smsCount) {
        this.smsCount = smsCount;
    }

    public int getFlow() {
        return flow;
    }

    public void setFlow(int flow) {
        this.flow = flow;
    }

    public SuperPackage(){
        //套餐数据初始化
        this.talkTime = 200;
        this.smsCount = 50;
        this.flow = 1*1024;
        this.price = 78.0;
    }
    @Override
    public void showInfo() {
        System.out.println("超人套餐:通话时长为"+this.talkTime+"分钟/月,短信条数为"+this.smsCount+"条/月,上网流量为"+this.flow/1024+"GB/月。");
    }


    /**
     * 提供上网服务
     */
    public int netPlay(int flow, MobileCard card) throws Exception {
        int temp = flow;
        for(int i=0;i<flow;i++){
            if(this.flow-card.getRealFlow()>=1){
                //第一种情况:套餐剩余流量可以支持使用1M流量
                card.setRealFlow(card.getRealFlow()+1); //实际使用流量加1MB
            }else if(card.getMoney()>=0.1){
                //第二种情况:套餐流量已用完,账户余额可以支付1M流量,使用账户余额支付
                card.setRealFlow(card.getRealFlow()+1); //实际使用流量加1MB
                card.setMoney(Common.sub(card.getMoney(),0.1)); //账户余额消费0.1元(1M流量费用)
                card.setConsumAmount(card.getConsumAmount() + 0.1);
            }else{
                temp = i;
                throw new Exception("本次已使用流量"+i+"MB,您的余额不足,请充值后再使用!");
            }
        }
        return temp;
    }

    /**
     * 提供通话服务
     */
    public int call(int minCount, MobileCard card) throws Exception{
        int temp = minCount;
        for(int i=0;i<minCount;i++){
            if(this.talkTime-card.getRealTalkTime()>=1){
                //第一种情况:套餐剩余通话时长可以付1分钟通话
                card.setRealTalkTime(card.getRealTalkTime()+1); //实际通话数据加1
            }else if(card.getMoney()>=0.2){
                //第二种情况:套餐通话时长已用完,账户余额可以支付1分钟通话,使用账户余额支付
                card.setRealTalkTime(card.getRealTalkTime()+1); //实际使用通话时长1分钟
                card.setMoney(Common.sub(card.getMoney(),0.2)); //账户余额消费0.2元(1分钟额外通话)
                card.setConsumAmount(card.getConsumAmount() + 0.2);
            }else{
                temp = i; //记录实现通话分钟数
                throw new Exception("本次已通话"+i+"分钟,您的余额不足,请充值后再使用!");
            }
        }
        return temp;
    }

    /**
     * 提供短信服务
     */
    查看详情  

java面向对象概述和三大特性

   Java是面向对象的高级编程语言,类和对象是Java程序的构成核心。围绕着Java类和Java对象,有三大基本特性:封装是Java类的编写规范、继承是类与类之间联系的一种形式、而多态为系统组件或模块之间解耦提供了解决方... 查看详情

大数据必学java基础(四十六):内部类和面向对象项目实战(代码片段)

文章目录内部类和面向对象项目实战一、内部类1、成员内部类2、局部内部类二、面向对象项目实战1、项目需求2、项目结构分析3、最终代码内部类和面向对象项目实战一、内部类1、成员内部类packagecom.lanson.test07;/***1.类的组成&#... 查看详情

scala核心编程_第09章面向对象编程(高级特性)(代码片段)

...象调用的,而是通过类对象调用的,所以静态操作并不是面向对象的。Scala中静态的概念-伴生对象Scala语言是完全面向对象(万物皆对象)的语言,所以并没有静态的操作(即在Scala中没有静态的概念 查看详情

07《java从零到壹》第七讲:面向对象高级特性(文末有课后作业)

❤️作者主页:小虚竹❤️作者简介:大家好,我是小虚竹。Java领域优质创作者 查看详情

面向对象编程java

面向对象编程【Java】1、初识面向对象2、方法回顾和加深方法调用3、对象的创建分析4、面向对象三大特性5、抽象类和接口6、内部类及OOP实战Java的核心思想就是OOP1、初识面向对象语句多了的话,提取出来,构造方法ÿ... 查看详情

五.面向对象高级特性2.内部类的分类

内部类可以是静态(static)的,可以使用public、protected和private访问控制符,而外部类只能使用public,或者默认。成员式内部类在外部类内部直接定义(不在方法内部或代码块内部)的类就是成员式内部类,它可以直接使用外部类的... 查看详情

深入java虚拟机-jvm高级特性和实战

第一部分走近java第一章java技术体系  官方所定义的java技术体系java程序设计语言各硬件平台上的java虚拟机Class文件格式javaapi类库来自商业机构和开源社区的第三方java类库  我们可以把java程序设计语言、java虚拟机、javaapi类... 查看详情

java动物特性的面向对象描述项目

...的方式是:旺旺叫狗烦躁的时候会:呜呜叫狗有4条腿只能用面向对象,不能用别的,有水生,和陆生.把接口完善一下啊,完善了给你分定义LandAnimal接口和WaterAnimal接口,只定义个接口好定义,只是你的题目用不到啊。(没水生和陆生啊)... 查看详情

五.面向对象高级特性5.接口和抽象类的区别

类是对象的模板,抽象类和接口可以看做是具体的类的模板。由于从某种角度讲,接口是一种特殊的抽象类,它们的渊源颇深,有很大的相似之处,所以在选择使用谁的问题上很容易迷糊。我们首先分析它们具有的相同点。 都... 查看详情

javascript高级编程笔记05(面向对象)

面向对象设计es中有两种属性:数据属性和访问器属性数据属性:数据属性包含一个数据值的位置,在这个位置可以读取和写入值,数据属性有4个描述其行为的特性[[Configurable]]:表示能否通过delete删除属性从而重新第一属性,能否修改... 查看详情

学习java分为几个阶段,分别是啥

...分为5个阶段吧!第一阶段:Java编程入门1.Java基础语法2.面向对象编程思想第二阶段:JavaSE进阶1.Java常用API2.多线程并发编程3.数据结构/集合框架4.IO/网络编程/反射/设计模式第三阶段:主流数据库管理系统1.MySQL/Oracle2.JDBC第四阶段... 查看详情

java面向对象三大特性之封装

...东西,就想以前遇见的一个老师一样,他说他每讲一次讲面向对象都有着不同 查看详情

kotlin实战之面向对象特性全方位总结(代码片段)

工匠若水可能会迟到,但是从来不会缺席,最终还是觉得将自己的云笔记分享出来吧~特别说明,kotlin系列文章均以Java差异为核心进行提炼,与Java相同部分不再列出。随着kotlin官方版本的迭代,文中有些... 查看详情

golang入门到项目实战golang方法

参考技术Ago语言没有面向对象的特性,也没有类对象的概念。但是,可以使用结构体来模拟这些特性,我们都知道面向对象里面有类方法等概念。我们也可以声明一些方法,属于某个结构体。Go中的方法,是一种特殊的函数,定... 查看详情

elk性能优化实战总结:java对象三大特性

Java架构师成长笔记:首先肯定是Java基础复习SpringBoot快速上手Web编程探索SSM从入门到精通1-3年高级工程师微服务并发编程进阶深入Tomcat底层JVM深度剖析3-5年资深高级架构师中间件&分布式数据库Spark最后整理的这些资料希望... 查看详情

[7]面向对象高级编程

[7]面向对象高级编程数据封装、继承和多态只是面向对象程序设计中最基础的3个概念。在Python中,面向对象还有很多高级特性,允许我们写出非常强大的功能。我们会讨论多重继承、定制类、元类等概念。使用__slots__正常情况... 查看详情

面向对象(高级)1

‘‘‘面向对象的三大特性:封装、继承和多态类的成员:字段,方法,属性‘‘‘‘‘‘字段:普通字段,静态字段,它们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同1.普通字段属于对象2.静态字段属... 查看详情