第5、7周个人银行账户管理系统java版本总结博客

一、
java是一门面向对象的语言,在个人银行账户管理系统的改写中,深刻体会到了面向对象的好处,那就是易维护、质量高、效率高、易扩展。
二、
在对第4章的改写中,将id, lastDate,balance, rate, accumulation定义为私有变量,体现出了面向对象的封装性,通过公共方法才可以访问它们,保障了数据的安全与稳定。利息的计算方法和记录也是私有的,用户不可以进行修改。
普通类:

public class SavingsAccount {
	private int id, lastDate;
	private double balance, rate, accumulation;

	private double accumulate(int data) {
		return accumulation + balance * (data - lastDate);
	}

	private void record(int data, double amount) {
		accumulation = accumulate(data);
		lastDate = data;
		balance += amount;
		System.out.println(data + "  #" + id + "   " + String.format("%.2f", amount) + "    "
				+ String.format("%.2f", balance) + "\n");
	}

	public SavingsAccount(int data1, int id1, double rate1) {
		id = id1;
		lastDate = data1;
		rate = rate1;
		System.out.println(data1 + "\t#" + id1 + " is created\n");
	}

	public int getid() {
		return id;
	}

	public double getBalance() {
		return balance;
	}

	public double getRate() {
		return rate;
	}

	public void deposit(int date, double amount) {
		record(date, amount);
	}

	public void withdraw(int date, double amount) {
		if (getBalance() < amount) {
			System.out.println("Error: not enough money");
		} else
			record(date, -amount);
	}

	public void settle(int date) {
		double inter = accumulate(date) * rate / 365;
		if (inter != 0)
			record(date, inter);
		accumulation = 0;
	}

	public void show() {
		System.out.println("#" + getid() + "    Balance: " + String.format("%.2f", getBalance()));
	}

	public static void main(String[] args) {
 		SavingsAccount s0 = new SavingsAccount(1, 21325302, 0.015);
		SavingsAccount s1 = new SavingsAccount(1, 58320212, 0.015);
		s0.deposit(5, 5000);
 		s1.deposit(25, 10000);
		s0.deposit(45, 5500);
		s1.withdraw(60, 4000);
		s0.settle(90);
		s1.settle(90);
		s0.show();
		s1.show();
	}
}

三、
在对第5章的改写中,增添静态属性与方法,增加静态的属性total,方便记录所有账号的总金额,同时静态方法,方便查询total,这种操作使得不需要在进行实例化。静态变量的值,直接赋新值即可,不需要参数传递,之后可以直接进行参数引用即可;静态方法可以直接通过"类名.方法"的形式进行方法调用。通常方法被多次调用,并且方法中没有动态方法引用的时候使用比较方便。
静态属性与方法:

private static double total;
public static double getTotal() {
		return total;
}

四、
在对第6章的改写中,使用了对象数组,并且增添了字符串,java里的数组本书就是引用,在建立Account数组的时候同时为对象申请空间否则会造成NullPoint。这里是java对象数组与c++不同之处。

public static void main(String []args) {
		date data=new date(2008,11,5);
		Account a[]= {
			new Account(data,"S3755217",0.015),
			new Account(data,"02342342",0.015)
		};
		a[0].deposit(new date(2008,11,5), 5000, "salary");
		a[1].deposit(new date(2008, 11, 25), 10000, "sell stock 0323");
		a[0].deposit(new date(2008, 12, 5), 5500, "salary");
		a[1].withdraw(new date(2008, 12, 20), 4000, "buy a laptop");
		System.out.println("\n");
		for(int i=0;i<2;i++) {
			a[i].settle(new date(2009, 1, 1));
			a[i].show();
			System.out.println("\n");
		}
		System.out.println("Total: "+Account.getTotal()+"\n");
	}

五、
在对第7章的改写中,抽象出了父类使得代码扩展性更高,父类Account,派生出子类creditAccount和savingsaccount,同样的代码不需要重复写,直接继承父类,使得代码更加简洁,也更好纠错。

学会java继承的语法:

public class CreditAccount extends Account
public class SavingsAccount extends Account

六、
在对第8章的改写中,使用了多态的性质,java里的多态主要体现在重载和覆盖,注意java里没有运算符的重载。类似c++里的虚函数,java里面有abstract关键字,只要某给个类里含有abstract方法,就必须在类前声明abstract,这是java里面的抽象类的概念,有了抽象类,个人理解就像是给了招牌,通过这个招牌可以理解子类的共同作用。通过这个地方感受到了c++与java在抽象类的不同。
抽象类:

public abstract class Account {
	private String id;
	private double balance;
	private static double total;
	protected Account(date d,String s){
			id=s;balance=0;
			d.show();
			System.out.println("\t#"+id+" created");
	}
	protected void record(date d,double amount,String desc) {
		balance+=amount;
		total+=amount;
		d.show();
		System.out.println("\t#"+id+"\t"+String.format("%10.2f",amount)+"\t"+String.format("%10.2f", balance)+"\t"+desc);
	}
	protected void error(String s) {
		System.out.println("Error(#"+id+"): "+s);
	}
	public String getId() {
		return id;
	}
	public double getBalance() {
		return balance;
	}
	public static double getTotal() {
		return total;
	}
	public abstract void deposit(date data, double amount,String desc);
	public abstract void show();
	public abstract void withdraw(date data, double amount,String desc);
	public abstract void settle(date data);
}

七、
在对第9章的改写中,使用了容器来代替数组,注意到java中没有指针和模板,改写起来还是有点难度的。同时java里也没有char,我是按照输入字符串然后通过charAt(0)取出第一个字符。
主要的选择片段:

do {
			d.show();
			System.out.println("\tTotal: "+Account.getTotal()+"\tcommand> ");
			int index, day;
			double amount;
			String desc;
			Scanner input=new Scanner(System.in);
			String c=input.next();
			cmd=c.charAt(0);
			switch(cmd) {
			case 'd':
				index=input.nextInt();
				amount=input.nextDouble();
				desc=input.next();
				accounts[index].deposit(d, amount, desc);
				break;
			case 'w':	//取出现金
				index=input.nextInt();
				amount=input.nextDouble();
				desc=input.next();
				accounts[index].withdraw(d, amount, desc);
				break;
			case 's':	//查询各账户信息
				for (int i = 0; i < 3; i++) {
					System.out.print("["+i+"] ");
					accounts[i].show();
				}
				break;
			case 'c':	//改变日期
				day=input.nextInt();
				if (day < d.getDay())
					System.out.println("You cannot specify a previous day");
				else if (day > d.getMaxday())
					System.out.println("Invalid day");
				else
					d = new date(d.getYear(), d.getMonth(), day);
				break;
			case 'n':	//进入下个月
				if (d.getMonth() == 12)
					d = new date(d.getYear() + 1, 1, 1);
				else
					d = new date(d.getYear(), d.getMonth() + 1, 1);
				for (int i = 0; i < 3; i++)
					accounts[i].settle(d);
				break;
			}
		}while(cmd !='e');
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值