1.多态的处理不同
编译时多态:函数重载,在这点上java与c++应该没有什么不同;
也有的人说重载不算多态,小伙伴们怎么看?
运行时多态:父类引用,指向子类对象;运行时解释器自动根据对象类型,调用子类
的相应方法。对于java,要想实现运行时多态,只需满足父类中也定义了相应方法,而不管该方法是否抽象;对于c++,父类中定义了相应方法且父类的相应
方法必须为virtual方法,运行时多态才会
自动调用子类方法。函数重载就跟虚函数没关系了吧;运行时重载肯定是基于虚函数的.
2.初始化的处理不同
c++与java的另外一个不同,new 操作符:
C++中对象变量名即是对象本身,新建对象只需要CLASSA a;
java中对象的变量名是引用,新建对象需要new才行。 CLASSA a= new CLASSA();
java中的new 是新建对象所必须的,因为java中只有引用。
C++类中的成员对象,不需要在类中或类外进行显示的初始化动作,其会随着类对象的创建而自动初始化。
对于类的对象也是一个道理,其作为类外的变量的时候,定义与初始化是一体的,在其定义处即进行初始化了。在header文件中及类的定义处,可以仅仅作为声明来看。除此以外,凡是作为变量出现的地方,都是定义的地方即初始化了。
例如,
#include
using namespace std;
int test();
class smallcircle
{
public:
smallcircle()
{
cout<<"smallcircle built"<
}
};
class circle
{
private:
smallcircle smcl;
public:
circle()
{
cout<<"对象创建!"<
}
};
int main()
{
circle c;
test();
return 0;
}
int test()
{
circle d;
return 0;
}
c++中的new 运算符,用来为一个对象的指针创建对象。而且只有这种方式的对象创建,才需要delete;
回收基本类型组成的数组空间用 delete 和 delete[] 都是应该可以的;但是对于类对象数组,只能用delete[]。对于 new 的单个对象,只能用 delete 不能用 delete[] 回收空间.
3.子类显式调用父类构造函数的方法不同
c++与java的另外一个不同,子类显式调用父类构造函数的方法:
c++中,
-
class CB : public CA {
-
public:
-
CB(int k) :CA(k) { }
-
};
java中: super();
析构函数,会先析构子函数再析构父函数
以下几点,是JAVA有而C++缺乏的特性
4.强大的反射机制和RTTI特性
这个特性是当前流行的J2EE framework的基础,如Spring,Hibernate,无不利用了Java强大的反射机制。
Java可以在运行期动态创建class,并且invoke某一个方法。
MyClass helper = (MyClass) Class.forName(className).newInstance();
5.内建对多线程的支持和synchronized关键字
C++标准本没有提供比如创建thread的方法,不过现在出现了boost::thread应该是将来的C++标准。Java中有synchronized这个关键字,这是一种很简单,安全的锁机制。多线程编程很重要,但是也很复杂。希望新的C++ 0x标准能支持。
synchronized void initConfig() {
if (!loaded) {
load();
loaded = true;
}
}
6.匿名类
匿名类可以有效的减少类的数目,是一种很有用的语言特性
new Thread(new Runnable() {
public void run() {
downloader.download();
}
}).start();
上面是启动一个新的thread来执行下载任务
7.final关键字
final使得更有效的表达设计者不希望被继承的意图。Java里面的final不等于C++的const。final用于class前面表示class不希望被继承,用于成员函数之前表示不希望被覆盖。这对于类库的设计是很重要的。毕竟不是每个类都为被继承做好了准备。
8.构造函数可以互相调用
这个特性使得写构造函数更加方便
class Test
{
public Test()
{
this(1);
}
public Test(int i)
{
this.i = i;
}
private int i;
}
9.package的概念
package不但有比C++ namespace更加强大避免冲突的功能,而且提供了一种更清晰的源代码结构。
比如java中
package com.cppblog.io.*;
C++要实现这样的,必须
namespace com
{
namespace cppblog
{
namespace io
{
}
}
}
10finally关键字
finally使得exception设计更加完备.很遗憾,C++里面只有try catch,虽然可以通过一些方法来work around,但是毕竟不是很方便。
try{
openConnection();
}
catch(ConnectionException e){
e.printStackTrace();
}
finally{
closeConnection();
}
阅读(2622) | 评论(0) | 转发(1) |