Java和C ++之间的对象创建的主要区别是什么?

我正准备参加Java考试,之前考试的一个问题是:“Java和C ++之间对象创建的主要区别是什么?”

我想我知道对象创建的基础知识,例如如何调用构造函数以及Java中的初始化块以及当一个类的构造函数调用另一个尚未构造的类的方法时会发生什么等等,但我可以找不到任何明显的东西。 答案应该是一两句话,所以我不认为Java中整个对象创建过程的描述就是他们想到的。

有任何想法吗?

Java和C ++之间的对象创建的主要区别是什么?

与Java不同,C ++对象也可以在堆栈上创建。

例如,在C ++中,您可以编写

Class obj; //object created on the stack 

在Java中你可以写

 Class obj; //obj is just a reference(not an object) obj = new Class();// obj refers to the object 

除了堆/堆栈问题,我会说:C ++构造函数具有初始化列表,而Java使用赋值。 有关详细信息,请参阅http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.6 。

我会回答:C ++允许在任何地方创建一个对象:堆,堆栈,成员。 Java强制您始终在堆上分配对象。

在Java中,执行Java代码的Java虚拟机(JVM) 必须可以记录所有正在创建的对象(或者对它们的引用是准确的),以便以后为对象分配的内存可以通过垃圾回收自动释放。不再引用了。

编辑:我不确定这是否可以归因于严格意义上的对象创建,但它确实在创建和赋值给变量之间发生,即使没有显式赋值(当你创建一个没有赋值的对象时,JVM有在那之后的一段时间自动释放它,因为没有更多的引用)。

在C ++中,只有在堆栈上创建的对象才会自动释放(当它们超出范围时),除非您使用某种机制来为您处理此问题。

1 :取决于JVM的实现。

C ++和Java中的构造函数之间存在一个主要的设计差异。 其他差异来自此设计决策。

主要区别在于JVM在开始执行任何构造函数之前首先将所有成员初始化为零。 在C ++中,成员初始化是构造函数的一部分。

结果是在执行基类构造函数期间,在C ++中派生类的成员尚未初始化! 在Java中,它们已被零初始化。

因此,在paercebal的答案中解释的规则是,从构造函数调用的虚拟调用不能下降到派生类中。 否则可以访问未初始化的成员。

假设c ++在进行新调用时使用alloc(),那么这可能就是他们正在寻找的东西。 (我不懂C ++,所以在这里我可能会非常错误)

Java的内存模型在需要时分配一块内存,并且对于每个新内存使用此预分配区域。 这意味着java中的一个新东西只是设置一个指向内存段的指针并移动自由指针,而C ++中的新函数(授予它在后台使用malloc)将导致系统调用。

这使得用Java创建的对象比使用malloc的语言更便宜; 至少在没有初始化的时候。

简而言之 – 用Java创建对象很便宜 – 除非你创建它们,否则不要担心它。