个人银行账户管理系统后序

242 阅读13分钟

这个版泵的银行管理系统,相对于以前的银行管理系统没有太大的变化,在原来版本的银行管理系统上加入了抽象类,同时加入了其他类型账户。

一.个人银行管理账户0.4

1.在使用体会this时,注意this所指向的对象或者指向的内容,

import static java.lang.Math.*;
public class Account{
	   private String id;	//帐号
		private double balance;	//余额
		private static double total; //所有账户的总金额
		//供派生类调用的构造函数,id为账户
		protected Account(final Date date, final String id) {
			this.id=id;
		    this.balance=0;
			date.show();
			System.out.println("\t#"+id+ " created");
		}
		//记录一笔帐,date为日期,amount为金额,desc为说明
		void record(final Date date, double amount, final String desc) {
			amount = floor(amount * 100 + 0.5) / 100;	//保留小数点后两位
			balance += amount;
			total += amount;
			date.show();
			System.out.println("\t#"+"\t"+amount+"\t"+balance+"\t"+desc);
		}
		//报告错误信息
		void error(final String msg) {
			System.out.println("Error(#"+id+"):"+msg);
		}
		public final String getId() { return id; }
		public double getBalance() { return balance; }
		public static double getTotal() { return total;}
		//显示账户信息
		void show() {
			System.out.println(id+ "\tBalance: "+balance);
		}
		
		public static void main(String args[]) {
			Date date=new Date(2008, 11, 1);	//起始日期
			//建立几个账户
			SavingsAccount sa1=new SavingsAccount(date, "S3755217", 0.015);
			SavingsAccount sa2=new SavingsAccount(date, "02342342", 0.015);
			CreditAccount ca=new CreditAccount(date, "C5392394", 10000, 0.0005, 50);
			//11月份的几笔账目
			sa1.deposit(new Date(2008, 11, 5), 5000, "salary");
			ca.withdraw(new Date(2008, 11, 15), 2000, "buy a cell");
			sa2.deposit(new Date(2008, 11, 25), 10000, "sell stock 0323");
			//结算信用卡
			ca.settle(new Date(2008, 12, 1));
			//12月份的几笔账目
			ca.deposit(new Date(2008, 12, 1), 2016, "repay the credit");
			sa1.deposit(new Date(2008, 12, 5), 5500, "salary");
			//结算所有账户
			sa1.settle(new Date(2009, 1, 1));
			sa2.settle(new Date(2009, 1, 1));
			ca.settle(new Date(2009, 1, 1));
			//输出各个账户信息
			System.out.println("\n");
			sa1.show();System.out.println("\n");
			
			sa2.show();System.out.println("\n");
			ca.show(); System.out.println("\n");
			System.out.println("Total:"+getTotal());
		}
		 static class Date {
			private int year;		//年
			private int month;		//月
			private int day;		//日
			private int totalDays;
			final int DAYS_BEFORE_MONTH[] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 };//该日期是从公元元年1月1日开始的第几天
				public Date(int year, int month, int day) {
					this.year=year;
					this.month=month;
					this.day=day;
					if (day <= 0 || day > getMaxDay()) {
						System.out.println("\"Invalid date: \"");
						show();
						System.out.println("\n");
						System.exit(1);
					}
					int years = year - 1;
					totalDays = years * 365 + years / 4 - years / 100 + years / 400
						+ DAYS_BEFORE_MONTH[month - 1] + day;
					if (isLeapYear() && month > 2) totalDays++;//用年、月、日构造日期{
				}
				int getYear()  { return year; }
				int getMonth()  { return month; }
				int getDay()  { return day; }
				int getMaxDay() {
					if (isLeapYear() && month == 2)
						return 29;
					else
						return DAYS_BEFORE_MONTH[month]- DAYS_BEFORE_MONTH[month - 1];//获得当月有多少天
				}
				boolean isLeapYear(){	//判断当年是否为闰年
					return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
				}
				void show() {//输出当前日期
					System.out.println(getYear()+"-"+getMonth()+"-"+getDay());
				}
				//计算两个日期之间差多少天	
				int distance(final Date date) {
					return totalDays - date.totalDays;
				}
		 }
		static class SavingsAccount extends Account { //储蓄账户类
			private Accumulator acc;	//辅助计算利息的累加器
			private double rate;		//存款的年利率
			//构造函数
			public SavingsAccount(final Date date, final String id, double rate) {
				super(date,id);
				this.rate=rate;
				this.acc=new Accumulator(date,0);
			}
			public double getRate() { return rate; }
			//存入现金
			public void deposit(final  Date date, double amount, final String desc) {
				record(date, amount, desc);
				acc.change(date, getBalance());
			}
			//取出现金
			void withdraw(final Date date, double amount, final String desc) {
				record(date, amount, desc);
				acc.change(date, getBalance());
			}
			//结算利息,每年1月1日调用一次该函数
			void settle(final Date date) {
				double interest = acc.getSum(date) * rate	//计算年息
						/ date.distance(new Date(date.getYear() - 1, 1, 1));
					if (interest != 0)
						record(date, interest, "interest");
					acc.reset(date, getBalance());
			}
		}
		static class CreditAccount extends Account { //信用账户类
			private Accumulator acc;	//辅助计算利息的累加器
			private double credit;		//信用额度
			private double rate;		//欠款的日利率
			private double fee;			//信用卡年费

			private double getDebt() {	//获得欠款额
				double balance = getBalance();
				return (balance < 0 ? balance : 0);
			}
			//构造函数
			public CreditAccount(final Date date, final String id, double credit, double rate, double fee) {
				super(date, id);
				this.credit=credit;
				this.rate=rate;
				this.fee=fee; 
				this.acc=new Accumulator(date,0);
			}
			public double getCredit(){ return credit; }
			public double getRate(){ return rate; }
			public double getFee(){ return fee; }
			public	double getAvailableCredit(){	//获得可用信用
				if (getBalance() < 0) 
					return credit + getBalance();
				else
					return credit;
			}
			//存入现金
			public void deposit(final Date date, double amount, final String desc) {
				record(date, amount, desc);
				acc.change(date, getDebt());
			}
			//取出现金
			public void withdraw(final Date date, double amount, final String desc) {
				 
				 
				if (amount - getBalance() > credit) {
					error("not enough credit");
				} else {
					record(date, -amount, desc);
					acc.change(date, getDebt());
				}
			}
			//结算利息和年费,每月1日调用一次该函数
			void settle(final Date date) {
				double interest = acc.getSum(date) * rate;
				if (interest != 0)
					record(date, interest, "interest");
				if (date.getMonth() == 1)
					record(date, -fee, "annual fee");
				acc.reset(date, getDebt());
			}

			void show() {
				super.show();
				System.out.println("\tAvailable credit:" + getAvailableCredit());
			}
		}
		class Accumulator {	//将某个数值按日累加
			private Date lastDate;	//上次变更数值的时期
			private double value;	//数值的当前值
			private double sum;		//数值按日累加之和
			//构造函数,date为开始累加的日期,value为初始值
			public Accumulator(final Date date, double value) {
				this.lastDate=date;
				this.value=value;
				this.sum=0;
			}

			//获得到日期date的累加结果
			public double getSum(final Date date){
				return sum + value * date.distance(lastDate);
			}

			//在date将数值变更为value
			public void change(final Date date, double value) {
				sum = getSum(date);
				lastDate = date;
				this.value = value;
			}

			//初始化,将日期变为date,数值变为value,累加器清零
			public void reset(final Date date, double value) {
				lastDate = date;
				this.value = value;
				sum = 0;
			}
		}

个人银行账户管理系统0.5

1.在对代码转换的时候对show()函数有很大的困难,show函数定义为抽象类的产生了困惑,试过将show函数设置为抽象类,但是在通过子类调用这个抽象方法的时候就会产生错误,对于Java来说,抽象方法是只能声明函数和参数,具体的实现过程在子类中实现。

2.在实现从键盘读取输入可以用Scanner这个类,也可以用标准输入流。

import static java.lang.Math.*;
import java.util.Scanner;
abstract public class Account{
		private String id;	//帐号
		private double balance;	//余额
		static double total; //所有账户的总金额
		//供派生类调用的构造函数,id为账户
		protected Account(final Date date, final String id) {
			this.id=id;
			this.balance=0;
			date.show();
			System.out.println("\t#"+id+"created");
		}
		//记录一笔帐,date为日期,amount为金额,desc为说明
		protected void record(final Date date, double amount,final String desc) {
			amount = floor(amount * 100 + 0.5) / 100;	//保留小数点后两位
			balance += amount;
			total += amount;
			date.show();
			System.out.println("\t#"+id+"\t"+amount+"\t"+balance+"\t"+desc);
		}
		//报告错误信息
		protected void error(final String msg) {
			System.out.println("Error(#"+id+ "): " +msg);
		}
		public final String getId(){ return id; }
		public double getBalance() { return balance; }
		public static double getTotal() { return total; }
		//存入现金,date为日期,amount为金额,desc为款项说明
		abstract public void deposit(final Date date, double amount,final String desc);
		//取出现金,date为日期,amount为金额,desc为款项说明
		abstract public void withdraw(final  Date date, double amount, final String desc);
		//结算(计算利息、年费等),每月结算一次,date为结算日期
		abstract public void settle(final Date date);
		//显示账户信息
		public void show() {
			System.out.println(id+ "\tBalance: " +balance);
		}
		public static void main(String args[]){
			Date date=new Date(2008, 11, 1);	//起始日期
			//建立几个账户
			SavingsAccount sa1=new SavingsAccount(date, "S3755217", 0.015);
			SavingsAccount sa2=new SavingsAccount(date, "02342342", 0.015);
			CreditAccount ca=new CreditAccount(date, "C5392394", 10000, 0.0005, 50);
			Account accounts[] = { sa1, sa2, ca };
			final  int n = 3;	//账户总数
			System.out.println("(d)deposit (w)withdraw (s)show (c)change day (n)next month (e)exit");
			char cmd;
			do {
				//显示日期和总金额
				date.show();
				System.out.println("\tTotal: "+getTotal()+ "\tcommand> ");

				int index, day;
				double amount;
				String  desc;
				cmd= new java.util.Scanner(System.in).next().charAt(0);
				switch (cmd) {
				case 'd':	//存入现金
					Scanner input1=new Scanner(System.in);
					Scanner input2=new Scanner(System.in);
					index=input1.nextInt();
					amount=input2.nextDouble();
					desc=new java.util.Scanner(System.in).next();
					accounts[index].deposit(date, amount, desc);
					break;
				case 'w':
					Scanner input3=new Scanner(System.in);
					Scanner input4=new Scanner(System.in);//取出现金
					index=input3.nextInt();
					amount=input4.nextDouble();
					desc=new java.util.Scanner(System.in).next();
					accounts[index].withdraw(date, amount, desc);
					break;
				case 's':	//查询各账户信息
					for (int i = 0; i < n; i++) {
						System.out.println("["+i+"] ");
						accounts[i].show();
						System.out.println('\n');
					}
					break;
				case 'c'://改变日期
					Scanner input5=new Scanner(System.in);
					day=input5.nextInt();
					if (day < date.getDay())
					System.out.println( "You cannot specify a previous day");
					else if (day > date.getMaxDay())
					System.out.println("Invalid day");
					else
						date =new Date(date.getYear(), date.getMonth(), day);
					break;
				case 'n':	//进入下个月
					if (date.getMonth() == 12)
						date = new Date(date.getYear() + 1, 1, 1);
					else
						date = new Date(date.getYear(), date.getMonth() + 1, 1);
					for (int i = 0; i < n; i++)
						accounts[i].settle(date);
					break;
				}
			} while (cmd != 'e');
		}
}
class SavingsAccount extends Account { //储蓄账户类
	private Accumulator acc;	//辅助计算利息的累加器
	private double rate;		//存款的年利率
	//构造函数
	public  SavingsAccount(final Date date, final String id, double rate) {
	super(date,id);
	this.rate=rate;
	this.acc=new Accumulator(date,0);
	}
	public double getRate(){ return rate; }
	public void deposit(final Date date, double amount, final String desc) {
		record(date, amount, desc);
		acc.change(date, getBalance());
	}
	public void withdraw(final Date date, double amount,final String desc) {
		if (amount > getBalance()) {
			error("not enough money");
		} else {
			record(date, -amount, desc);
			acc.change(date, getBalance());
		}
	}
	public void settle(final Date date) {
		if (date.getMonth() == 1) {	//每年的一月计算一次利息
			double interest = acc.getSum(date) * rate
				/ date.distance(new Date(date.getYear() - 1, 1, 1));
			if (interest != 0)
				record(date, interest, "interest");
			acc.reset(date, getBalance());
		}
	}
}
class CreditAccount extends  Account { //信用账户类
	private Accumulator acc;	//辅助计算利息的累加器
	private double credit;		//信用额度
	private double rate;		//欠款的日利率
	private double fee;			//信用卡年费

	private double getDebt(){	//获得欠款额
		double balance = getBalance();
		return (balance < 0 ? balance : 0);
	}
	//构造函数
	public CreditAccount(final Date date, final String id, double credit, double rate, double fee) {
	super(date,id);
	this.credit=credit;
	this.rate=rate;
	this.fee=fee;
	this.acc=new Accumulator(date,0);
	}
	public double getCredit(){ return credit; }
	public double getRate() { return rate; }
	public double getFee()  { return fee; }
	public double getAvailableCredit()  {	//获得可用信用
		if (getBalance() < 0) 
			return credit + getBalance();
		else
			return credit;
	}
	public void deposit(final Date date, double amount, final String desc) {
		record(date, amount, desc);
		acc.change(date, getDebt());
	}
	public  void withdraw(final Date date, double amount,final String desc) {
		if (amount - getBalance() > credit) {
			error("not enough credit");
		} else {
			record(date, -amount, desc);
			acc.change(date, getDebt());
		}
	}
	public  void settle(final  Date date) {
		double interest = acc.getSum(date) * rate;
		if (interest != 0)
			record(date, interest, "interest");
		if (date.getMonth() == 1)
			record(date, -fee, "annual fee");
		acc.reset(date, getDebt());
	}
	public void show() {
		super.show();
		System.out.println("\tAvailable credit:"+getAvailableCredit());
	}
}
class Date {
	 int DAYS_BEFORE_MONTH[] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 };//日期类
	private int year;		//年
	private int month;		//月
	private int day;		//日
	private int totalDays;	//该日期是从公元元年1月1日开始的第几天
	public Date(int year, int month, int day) {
		this.year=year;
		this.month=month;
		this.day=day;
		if (day <= 0 || day > getMaxDay()) {
			System.out.println( "Invalid date: ");
			show();
			System.out.println('\n');
			System.exit(1);
		}
		int years = year - 1;
		totalDays = years * 365 + years / 4 - years / 100 + years / 400
			+ DAYS_BEFORE_MONTH[month - 1] + day;
		if (isLeapYear() && month > 2) totalDays++;//用年、月、日构造日期
	}
	int getYear()  { return year; }
	int getMonth()  { return month; }
	int getDay()  { return day; }
	int getMaxDay() {
		if (isLeapYear() && month == 2)
			return 29;
		else
			return DAYS_BEFORE_MONTH[month]- DAYS_BEFORE_MONTH[month - 1];//获得当月有多少天
	}
	boolean isLeapYear()  {	//判断当年是否为闰年
		return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
	}
	void show() {
		System.out.println(getYear()+"-"+getMonth()+"-"+getDay());//输出当前日期
	}
	//计算两个日期之间差多少天	
	int distance(final Date date) {
		return totalDays - date.totalDays;
	}
}
class Accumulator {	//将某个数值按日累加
	private Date lastDate;	//上次变更数值的时期
	private double value;	//数值的当前值
	private double sum;		//数值按日累加之和
	//构造函数,date为开始累加的日期,value为初始值
	public Accumulator(final Date date, double value) {
	this.lastDate=date;
	this.value=value;
	this.sum=0;
	}
	//获得到日期date的累加结果
	public double getSum(final Date date) {
		return sum + value *date.distance(lastDate);
	}

	//在date将数值变更为value
	void change( Date date, double value) {
		sum = getSum(date);
		lastDate = date;
		this.value = value;
	}

	//初始化,将日期变为date,数值变为value,累加器清零
	void reset(final Date date, double value) {
		lastDate = date;
		this.value = value;
		sum = 0;
	}
}

个人银行专户管理系统0.6

1.在修改代码的过程就卡在这里,在这个版本的银行账户管理系统中加入C++ 的模板,但是在Java中是没有C++中向template模板的,所以产生了困惑。最后决定用ArrayList这个类来解决这个问题。

import static java.lang.Math.*;
import java.util.ArrayList;
import java.util.Scanner;
abstract public class Account {
			private String  id;	//帐号
			private double balance;	//余额
			private static double total=0; //所有账户的总金额
			//供派生类调用的构造函数,id为账户
			protected Account(final Date date, final String id) {
				this.id=id;
				this.balance=0;
				date.show();
				System.out.println("\t#"+id+"created");
			}
			//记录一笔帐,date为日期,amount为金额,desc为说明
			protected void record(final Date date, double amount, final String desc) {
				amount = floor(amount * 100 + 0.5) / 100;	//保留小数点后两位
				balance += amount;
				total += amount;
				date.show();
				System.out.println("\t#"+id+"\t"+amount+"\t"+balance+"\t"+desc);
			}
			//报告错误信息
			protected void error(final String msg) {
				System.out.println("Error(#"+id+"): "+msg);
			}
			public final String getId() { return id; }
			public double getBalance()  { return balance; }
			public static double getTotal() { return total; }
			//存入现金,date为日期,amount为金额,desc为款项说明
			abstract void deposit(final Date date, double amount, final String desc);
			//取出现金,date为日期,amount为金额,desc为款项说明
			abstract void withdraw(final Date date, double amount,final String desc) ;
			//结算(计算利息、年费等),每月结算一次,date为结算日期
			abstract void settle(final Date date);
			//显示账户信息
			public void show() {
				System.out.println(id+"\tBalance: "+balance);
			}
			public static void  main(String args[]) {
				Date date=new Date(2008, 11, 1);
				 ArrayList <Account> accounts=new ArrayList();//起始日期
				System.out.println( "(a)add account (d)deposit (w)withdraw (s)show (c)change day (n)next month (e)exit" );
				char cmd;
				do {
					//显示日期和总金额
					date.show();
					System.out.println("\tTotal: " +getTotal()+ "\tcommand> ");

					char type;
					int index, day;
					double amount, credit, rate, fee;
					String id, desc;
					cmd=new java.util.Scanner(System.in).next().charAt(0);
					switch (cmd) {
					case 'a':	//增加账户
						type=new java.util.Scanner(System.in).next().charAt(0);
						id=new java.util.Scanner(System.in).next();
						if (type == 's') {
							rate=new java.util.Scanner(System.in).nextDouble();
							accounts.add(new SavingsAccount(date, id, rate));
						} else {
							credit=new java.util.Scanner(System.in).nextDouble();
							rate=new java.util.Scanner(System.in).nextDouble();
							fee=new java.util.Scanner(System.in).nextDouble();
							accounts.add(new CreditAccount(date, id, credit,rate,fee));
						}
						break;
					case 'd':	//存入现金
						index=new java.util.Scanner(System.in).nextInt();
						amount=new java.util.Scanner(System.in).nextDouble();
						desc=new java.util.Scanner(System.in).next();
						accounts.get(index).deposit(date, amount, desc);
						break;
					case 'w':	//取出现金
						index=new java.util.Scanner(System.in).nextInt();
						amount=new java.util.Scanner(System.in).nextDouble();
						desc=new java.util.Scanner(System.in).next();
					    accounts.get(index).withdraw(date, amount, desc);
						break;
					case 's':	//查询各账户信息
						for (int i = 0; i < accounts.size(); i++) {
							System.out.println("["+i+"] ");
							accounts.get(i).show();
							System.out.println('\n');
						}
						break;
					case 'c':	//改变日期
						day=new java.util.Scanner(System.in).nextInt();
						if (day < date.getDay())
						System.out.println("You cannot specify a previous day");
						else if (day > date.getMaxDay())
						System.out.println("Invalid day");
						else
							date = new Date(date.getYear(), date.getMonth(), day);
						break;
					case 'n':	//进入下个月
						if (date.getMonth() == 12)
							date = new Date(date.getYear() + 1, 1, 1);
						else
							date = new Date(date.getYear(), date.getMonth() + 1, 1);
						for (int i = 0; i < accounts.size(); i++)
							accounts.get(i).settle(date);
						break;
					}
				} while (cmd != 'e');
			}
}
class SavingsAccount extends Account { //储蓄账户类
	private Accumulator acc;	//辅助计算利息的累加器
	private double rate;		//存款的年利率
	//构造函数
	public SavingsAccount(final Date date, final String id, double rate) {
		super(date,id);
		this.rate=rate;
		this.acc=new Accumulator(date,0);
	}
	public double getRate() { return rate; }
	 public void deposit(final Date date, double amount, final String desc) {
		    record(date, amount, desc);
			acc.change(date, getBalance());
	 }
	 public void withdraw(final Date date, double amount, final String desc) {
		 if (amount > getBalance()) {
				error("not enough money");
			} else {
				record(date, -amount, desc);
				acc.change(date, getBalance());
			}
	 }
	 public void settle(final Date date) {
		 if (date.getMonth() == 1) {	//每年的一月计算一次利息
				double interest = acc.getSum(date) * rate
					/date.distance(new Date(date.getYear() - 1, 1, 1));
				if (interest != 0)
					record(date, interest, "interest");
				acc.reset(date, getBalance());
			}
	 }
}
class CreditAccount extends Account { //信用账户类
	private Accumulator acc;	//辅助计算利息的累加器
	private double credit;		//信用额度
	private double rate;		//欠款的日利率
	private double fee;			//信用卡年费

	private double getDebt() {	//获得欠款额
		double balance = getBalance();
		return (balance < 0 ? balance : 0);
	}
	//构造函数
	public CreditAccount(final Date date, final String id, double credit, double rate, double fee) {
	super(date,id);
	this.credit=credit;
	this.rate=rate;
	this.fee=fee;
	this.acc=new Accumulator(date,0);
	}
	public double getCredit()  { return credit; }
	public double getRate()  { return rate; }
	public double getFee()  { return fee; }
	public double getAvailableCredit()  {	//获得可用信用
		if (getBalance() < 0) 
			return credit + getBalance();
		else
			return credit;
	}
	 public void deposit(final Date date, double amount, final String desc) {
		 record(date, amount, desc);
			acc.change(date, getDebt());
	 }
	 public void withdraw(final Date date, double amount, final String desc) {
		 if (amount - getBalance() > credit) {
				error("not enough credit");
			} else {
				record(date, -amount, desc);
				acc.change(date, getDebt());
			}
	 }
	 public void settle(final Date date) {
		 double interest = acc.getSum(date) * rate;
			if (interest != 0)
				record(date, interest, "interest");
			if (date.getMonth() == 1)
				record(date, -fee, "annual fee");
			acc.reset(date, getDebt());
	 }
	 public void show() {
		 super.show();
			System.out.println("\tAvailable credit:"+getAvailableCredit());
	 }
}
class Date {
	int DAYS_BEFORE_MONTH[] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 };//日期类
	private int year;		//年
	private int month;		//月
	private int day;		//日
	private int totalDays;	//该日期是从公元元年1月1日开始的第几天
	public Date(int year, int month, int day) {
		this.year=year;
		this.month=month;
		this.day=day;//用年、月、日构造日期
		if (day <= 0 || day > getMaxDay()) {
			System.out.println("Invalid date: ");
			show();
			System.out.println('\n');
			System.exit(1);
		}
		int years = year - 1;
		totalDays = years * 365 + years / 4 - years / 100 + years / 400
			+ DAYS_BEFORE_MONTH[month - 1] + day;
		if (isLeapYear() && month > 2) totalDays++;
	}
	public int getYear()  { return year; }
	public int getMonth()  { return month; }
	public int getDay()  { return day; }
	public int getMaxDay() {		//获得当月有多少天
		if (isLeapYear() && month == 2)
			return 29;
		else
			return DAYS_BEFORE_MONTH[month]- DAYS_BEFORE_MONTH[month - 1];
	}
	public boolean isLeapYear()  {	//判断当年是否为闰年
		return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
	}
	public void show() {
		System.out.println(getYear() +"-"+getMonth()+"-"+getDay());
	}//输出当前日期
	//计算两个日期之间差多少天	
    public int distance(final Date date) {
		return totalDays - date.totalDays;
	}
}
class Accumulator {	//将某个数值按日累加
	private Date lastDate;	//上次变更数值的时期
	private double value;	//数值的当前值
	private double sum;		//数值按日累加之和
	//构造函数,date为开始累加的日期,value为初始值
	public Accumulator(final Date date, double value){ 
		this.lastDate=date;
	    this.value=value;
	    this.sum=0;
	}
	//获得到日期date的累加结果
	public double getSum(final Date date){
		return sum + value *date.distance(lastDate);
	}

	//在date将数值变更为value
	public void change(final Date date, double value) {
		sum = getSum(date);
		lastDate = date;
		this.value = value;
	}

	//初始化,将日期变为date,数值变为value,累加器清零
	public void reset(final Date date, double value) {
		lastDate = date;
		this.value = value;
		sum = 0;
	}
}

希望能过给有帮助的人,像我一样的。