简单的个人银行管理系统实现(二)

2、 个人银行管理系统版本0.2(对应第5章记录)

2.1系统需求

为活期存储账户类加入记录所有账户总金额的功能,并且能够输出总金额,其余功能与之前一致。

2.2系统设计

在SavingsAccount类中增加一个静态数据成员total,用来记录所有账户总金额,并增加相应静态成员方法getTotal对其访问。SavingsAccount类如下图所示:
这里写图片描述

2.3系统实现

SavingsAccount.java

package self.SelfBank2.test;

public class SavingsAccount {
    //储蓄账户类
        private int id;                 //账号
        private double balance;         //余额
        private double rate;            //存款的年利率
        private int lastDate;           //上次变更余额的时期
        private double accumulation;        //余额按日累加之和
        private static double total;    //所有账户的总金额

        private void record(int date, double amount) {
            //获得到指定日期为止的存款金额按日累积值   
            if(date <= lastDate){
                System.out.println("请检查输入!");
            }else{
            accumulation = accumulate(date);
            lastDate = date;
            amount = Math.floor(amount * 100 + 0.5) / 100;  //保留小数点后两位
            balance += amount;
            total += amount;
            System.out.println(date+"\t"+"#"+id+"\t"+amount+"\t"+balance);
            }
        }

        private final double accumulate(int date) { 
            if(date < lastDate){
                System.out.println("请输入正确的日期!");
                return 0;
            }else{
            return accumulation + balance * (date - lastDate);
            }
        }

        SavingsAccount(int date, int id, double rate){
            //构造函数及相关成员函数的实现
            if(date == 1 && rate > 0 && id > 0){
                this.id = id;
                this.balance = 0;
                this.rate = rate;
                this.lastDate = date;
                this.accumulation = 0;
                System.out.println(date+"\t"+"#"+id+" is created");
            }else {
                System.out.println("请检查输入!");
            }
        }

        public final int getId() { return id; }
        public final double getBalance() { return balance; }
        public static double getTotal() {
            return total;
        }
        public double getRate() { return rate; }

        public void deposit(int date, double amount){
            //存入现金;
            record(date, amount);
        }

        public void withdraw(int date, double amount){
            //取出现金
              if (amount > getBalance())
                  System.out.println("Error: not enough money");
              else if(amount <= 0){
                System.out.println("请检查输入!");
              }
              else
                  record(date, -amount);
        }
            //结算利息,每年1月1日调用一次该函数
        public void settle(int date){
                double interest = accumulate(date) * rate / 365;    //计算年息
                if (interest != 0)
                    record(date, interest);
                accumulation = 0;
        }
            //显示账户信息
        public void show(){
            System.out.println("#"+id+"\tBalance: "+balance);
        }
}

Main,java

package self.SelfBank2.test;

public class Main {

    public static void main(String[] args) {
        //建立几个账户
        SavingsAccount sa0 = new SavingsAccount(1,21325302,0.015);
        SavingsAccount sa1 = new SavingsAccount(1,58320212,0.015);

            //几笔账目
            sa0.deposit(5, 5000);
            sa1.deposit(25, 10000);
            sa0.deposit(45, 5500);
            sa1.withdraw(60, 4000);

            //开户后第90天到了银行的计息日,结算所有账户的年息
            sa0.settle(90);
            sa1.settle(90);

            //输出各个账户信息
            sa0.show(); System.out.println();
            sa1.show(); System.out.println();
            System.out.println("Total: "+SavingsAccount.getTotal());
        }

}

2.4系统测试

书上的例子得到的结果如下:
这里写图片描述
测试结果基本和之前版本相同,这里只测试了新加入的getTotal()函数。
使用Junit4来测试的代码如下:
初始化设置:
这里写图片描述
测试用例:
这里写图片描述
结果通过了测试:
这里写图片描述

2.5体会心得

这一节最大的问题是用const修饰的常函数在Java里怎么转换,我一开始认为将所有const换为final就可以,然而实际上有问题。const修饰成员函数的作用是:只能读取数据成员,不能改变数据成员。const成员函数只能调用const函数,不能调用其它非const成员函数;const对象只能调用const成员函数,不能调用非const成员函数。而final修饰的方法是不能被重载的,类似于类中的private方法,所以private方法默认是final的。所以final和C++的const差别太大了,而我查资料也没有发现关于java使用常函数的用法。然后既然是一种保护机制,我看了方法中的代码不涉及这个问题,所以没有这个功能也是可以的。
但我在代码中依然保留了final。带来的一个附带的好处就是,final方法可以被编译器优化,比如内联什么的,也就是说final的方法可能效率会高一些(仅仅是可能,具体取决于编译器),并且将方法的参数用final修饰的话,也可能会提高一定的性能。

有坑再填。。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值