要求:
- 模仿个人银行账户管理系统的C++版本(第4章-第8章),使用Java语言重新实现该系统,比较C++与Java在实现上的异同,熟练掌握Java基础及语法。
- 根据系统需求的演化,逐步完善个人银行账户管理系统的功能,改进代码,体会面向对象思想的封装、继承、多态特性在实际系统中的应用,初步掌握使用Java编写可复用、可扩展、可维护代码的基本技能。
版本记录:
-
版本1:4_9
- C++中的
double accumulate(int date) const
用Java语言实现时,应去掉const,并加上final修饰 - Java中,类的成员函数不能先写函数声明再将函数体内容写在后面,否则报错,如图。
- C++中使用的cout语句需要改为
System.out.println()
,同时这条语句也可单独使用来进行换行 - Java中对象的创建需要借助引用
- 注意主函数的固定格式为
public static void main(String[] args)
最终输出结果如下:
- C++中的
-
版本2:5_11
- 相较版本1增加了静态属性与方法
最终输出结果如下:
-
版本3:6_25
- 相较于之前又增加了字符串和对象数组
- 另外,在这一版本中多了一个调用类Date,因此需要创建package来实现
- C++源代码中出现
const std::string &getId() const { return id; }
这种函数前后均有const的情况,改为Java语言时,我仅在函数前增加了final,和其他函数的处理方式没有区别,不确定是否正确且规范,但仅从这个实验的输出结果来看是可行的 - 对于源代码中的
const int n = sizeof(accounts) / sizeof(SavingsAccount);
,Java中没有sizeof的用法,因此这里根据程序实际内容直接将等号后部分替换为2 - 最后还有一点小细节,使用
System.out.println()
将会默认换行,因此为了保持与C++源代码的输出形式一致,在某些地方应使用System.out.print()
(无换行)
最终输出结果如下:
-
版本4:7_10
- 子类继承父类后,构造函数中子类数据成员初始化的同时,需要利用
super()
函数对父类的数据成员进行初始化 - 子类方法需要调用父类方法时,父类函数不能用final,否则将会报错如下:
最终输出结果如下:
- 子类继承父类后,构造函数中子类数据成员初始化的同时,需要利用
-
版本5:8_8
- 当类内部有抽象方法时,需要将类也改为抽象类,否则报错如下:
抽象类中可以有零个或多个抽象方法,也可以包含非抽象的方法。只要有一个抽象方法,类前就必须有abstract修饰,如果没有抽象方法,类前也可有abstract修饰。 - abstract不能与final并列修饰同一个类(因为final修饰的类为最终类,不能有子类,这与abstract必定有子类有逻辑矛盾),否则报错如下:
- 这一版本中需要从键盘中接收一个字符,而Java原本并不支持接收单个字符,所以可以先接收一个字符串,然后再取字符串的第一个字符即可。
最终输出结果如下:
后续需自己输入,此处不展示 - 当类内部有抽象方法时,需要将类也改为抽象类,否则报错如下:
-
版本6:9_16
- C++中使用容器代替数组,而Java版本中,使用
import java.util.ArrayList;
即可实现这一功能 - 增加账户部分代码如下:
- C++中
delete accounts[i];
这一语句到Java版本可以使用accounts.remove(i);
- 除此以外,其他几个类与上一版本基本无区别
- C++中使用容器代替数组,而Java版本中,使用