个人银行账户管理系统技术总结
首先在class的创建过程中,C++习惯将private,public,protected的成员一起声明,而java习惯在每一个成员前声明其类型;然后对于类对象的创建,这一点两种语言有比较大的差别。对于Java而言,产生对象的代码是
new SavingsAccount();
这句话的含义是:根据类模板产生一个对象,并在计算机内存中为此对象开辟一块新的独立内存空间,实质上是将类中定义的属性复制到生成的对象中,为对象服务;开辟的新空间为栈空间,用于存放方法中的局部变量和形式参数,并且方法在执行时还能访问复制到对象中的属性,当方法执行完毕后再释放栈空间。而
SavingsAccount sa0;
这句代码虽然在C++中已经产生了一个对象,但在Java中只是产生了一个SavingsAccount的声明而已,并没有任何此类的对象产生,也没有为其分配空间,而这时的sa0就好比一个遥控器,使用它则需要给它绑定一个对象
SavingsAccount sa0 = new SavingsAccount(1, 21325302, 0.015);
在创建构造函数时,两种语言对其的初始化也有不同,对比如下
//构造函数 Java public SavingsAccount(int date, int id, double rate){ this.id = id; this.balance = 0; this.rate = rate; this.lastDate = date; this.accumulation = 0; System.out.println(date+"\t#"+id+"is created"); } //构造函数 C++ SavingsAccount::SavingsAccount(int date, int id, double rate) : id(id), balance(0), rate(rate), lastDate(date), accumulation(0) {cout << date << "\t#" << id << " is created" << endl;}
在C++中两种使用上述两种方法初始化都是可以的。在Java中如果构造函数的第一条语句是一条普通的语句。也就是说,不是对this()或super()的调用,那么java会插入一个隐式的super()调用,从而调用超类的默认构造函数。从该调用返回时,Java将对当前类的实例变量初始化,并继续执行当前构造函数的语句。如果构造函数的第一条语句是通过super()对一个超类构造函数的调用,那么Java则会调用所选定的超类构造函数。在其返回时,Java将对当前类的实例变量初始化,并继续执行当前构造函数的语句。
在C++的class中,源代码有许多地方是在类中定义方法,在类外实现
void record(int date, double amount); . .. ... void SavingsAccount::record(int date, double amount) { accumulation = accumulate(date); lastDate = date; amount = floor(amount * 100 + 0.5) / 100; //保留小数点后两位 balance += amount; total += amount; cout << date << "\t#" << id << "\t" << amount << "\t" << balance << endl; }
这样的布局可以使程序更加直观,可以直接在类中看到有哪些方法;而Java中则不行,Java是完全面向对象的语言,所有函数和变量部必须是类的一部分。除了基本数据类型之外,其余的都作为类对象,包括数组。对象将数据和方法结合起来,把它们封装在类中,这样每个对象都可实现自己的特点和行为。从这一点可以体会到Java面对对象的思想,相比于C++有更好的封装性。类似的Java可以把方法定义放在接口或抽象类中
具体实现用子类来做,
abstract class Account { private String id; private double balance; private static double total; . . . . abstract void deposit(Date date, double amount, String desc); abstract void withdraw(Date date, double amount, String desc); abstract void settle(Date date); } class CreditAccount extends Account{ private Accumulator acc; //辅助计算利息的累加器 private double credit; //信用额度 private double rate; //欠款的日利率 private double fee; //信用卡年费 . . . . //存入现金 public void deposit(Date date, double amount, String desc){ record(date,amount,desc); acc.change(date,getDebt()); } //取出现金 public void withdraw(Date date, double amount,String desc){ if (amount - getBalance() > credit) { error("not enough credit"); } else { record(date, -amount, desc); acc.change(date, getDebt()); } } //结算利息和年费,每月1日调用一次该函数 public void settle(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()); } . . . }
C++支持多重继承,这是C++的一个特征,它允许多父类派生一个类。尽管多重继承功能很强,但使用复杂,而且会引起许多麻烦,编译程序实现它也很不容易。Java不支持多重继承,但允许一个类继承多个接口,实现了C++多重继承的功能,又避免了C++中的多重继承实现方式带来的诸多不便。类似的,在Java中也没有操作符重载,在老师上课中提到了一个比较特别的例子,String中的+号运算符,作用则是字符串的拼接,只要其中一个数据的类型为String,+号都会起到这样的作用。至于Java为什么有提供运算符重载的功能,也没有给程序员自己重载运算符的权利,我觉得应该是为了精简程序然后创建了特定的包为此服务吧。
浙公网安备 33010602011771号