第一次实验是让我们将一个银行管理系统的C++改写成Java代码,这里说一下自己在改写过程中的体会。
C++与Java的区别
1. C++中方法声明可以和实现分离
在C++中可以将类定义和方法的声明放在一个头文件中(.h文件),然后将方法的实现体放在与头文件同名的源文件中(.cpp文件),但在Java中则必须将方法声明与实现写在一起,
2. Java中抽象方法与C++的纯虚函数相对应
Java中用abstract修饰的方法称为抽象方法,含有抽象方法的类称为抽象类,抽象方法只能有声明,不能有实现,其具体的实现要由继承了抽象类的具体类来实现,也就是说具体类必须覆盖抽象类的抽象方法;
在本实验中,抽象类为Account
,抽象方法有以下三个:
abstract public void deposit(Date date, double amount, String desc);
abstract public void withdraw(Date date, double amount, String desc);
abstract public void settle(Date date);
在C++中,与抽象方法对应的是纯虚函数,即用virtual void function() = 0;
定义的函数,纯虚函数也是没有实现,其实现代码必须有子类来指定,在本实验中C++版的Account类中纯虚函数的声明如下:
virtual void deposit(const Date &date, double amount, const std::string &desc) = 0;
virtual void withdraw(const Date &date, double amount, const std::string &desc) = 0;
virtual void settle(const Date &date) = 0;
3. Java中没有与const对应的关键字
在定义常量这一点上,Java中的final
与C++中的const
的作用一直,但const
修饰函数和修饰形参时还有其他的作用,而Java中则没有关键字来修饰形参,用final
修饰方法时的作用是防止该方法被子类覆盖,这与C++中const
修饰方法的作用也不同。
4. 对象声明与引用的区别
假设有一个类为Account
,在C++中通过Account account;
的方式直接生成了一个Account
对象,而在Java中Account account;
并不会创建一个对象,而仅仅是声明了一个对象引用,在Java中需要通过new Account();
来创建对象,然后将对象引用account
指向创建的对象,所以对象引用与对象创建的步骤是分开的。
5. 传参时的区别
在C++中,参数传递是默认是值传递,不管参数是什么类型都是值传递,如果需要引用传递的话则需要在形参中加入&符号,表示将实参的地址传给形参,引用传递的优点是效率很高,且节省了内存;在本实验中void deposit(const Date &date)
中的date就是引用传递;
在Java中,参数传递时有值传递和引用传递两种,当要传递的参数是普通数据类型时是值传递,当要传递的参数是复杂数据类型(如对象,数组)时则是引用传递,而无需显式指定要使用哪种传递方法,相比C++会更简洁一些,但使用时要时刻注意参数的传递方式。
6. 语法的区别
C++与Java在语法上的区别不是很大,if...else
, while
, for
, switch
语句的使用方法都是一样的,此外每条语句都需要一个分号(;)作为结束符。
在使用对象调用方法这一点上,Java中是通过点(.)来调用,如accounts.add
,在C++中如果是普通的对象的话,那么则通过点(.)来调用,如果是对象指针的话,则通过->
来调用对象的方法。
Java中不支持多继承,即一个类只能继承一个父类,因为多继承会让继承关系非常复杂,但C++中可以多继承。
总结
总的来说,Java比C++简洁一些,因为Java隐去了C++中最令人头痛的指针,但其实Java中的引用就是指针,只不过Java默认使用了引用,而无需让程序员来选择,这就帮助程序员减少了很多负担,程序员只需要谨记这是引用即可;
另一方面,Java的体系架构很完整,从JDK到JRE再到JVM,各种基础库、并发库、IO库、网络编程库都非常全面,并且效率很高。