一、
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');