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

And*_*aKo 19 c++ java creation object

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

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

有任何想法吗?

Pra*_*rav 26

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

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

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

Class obj; //object created on the stack
Run Code Online (Sandbox Code Playgroud)

在Java中你可以写

Class obj; //obj is just a reference(not an object)
obj = new Class();// obj refers to the object
Run Code Online (Sandbox Code Playgroud)

  • 我认为这是在对象创建之前发生的内存分配.真的算吗? (2认同)
  • 我不确定他们是在询问内存分配,但另一方面,我不确定他们是不是在询问内存分配问题. (2认同)

pae*_*bal 19

除了其他优秀的答案,有一点非常重要,通常忽略/忘记或误解(这可以解释为什么我下面详细过程):

  • 在Java中,方法是虚拟的,从构造方法中调用,即使(这可能会导致错误)
  • 在C++中,从构造函数调用虚拟方法时不是虚拟的(这可能会导致误解)

什么?

  • 让我们设想一个基类,使用虚方法foo().
  • 让我们想象一个Derived类,继承自Base,它重写方法foo()

C++和Java之间的区别是:

  • 在Java中,从Base类构造函数调用foo()将调用Derived.foo()
  • 在C++中,从Base类构造函数调用foo()将调用Base.foo()

为什么?

每种语言的"错误"都不同:

  • 在Java中,调用构造函数中的任何方法都可能导致细微的错误,因为重写的虚方法可能会尝试访问在Derived类中声明/初始化的变量.

从概念上讲,构造函数的工作是使对象存在(这不是一个普通的壮举).在任何构造函数中,整个对象可能只是部分形成 - 您只能知道基类对象已经初始化,但您无法知道哪些类是从您继承的.但是,动态绑定的方法调用会在转发层次结构中"前进"或"向外".它在派生类中调用方法.如果你在构造函数中执行此操作,则调用可能操作尚未初始化的成员的方法 - 这是一个确定的灾难方法.

Bruce Eckel,http://www.codeguru.com/java/tij/tij0082.shtml

  • 在C++中,必须记住虚拟将无法按预期工作,因为只会调用当前构造类的方法.原因是避免访问数据成员甚至是尚不存在的方法.

在基类构造期间,虚函数永远不会归结为派生类.相反,该对象的行为就像它是基本类型一样.非正式地说,在基类构建期间,虚函数不是.

Scott Meyers,http://www.artima.com/cppsource/nevercall.html

  • 1,我偶然发现了这对我自己......我的父母告诉我,很多危险的事情,在那里,但从来没有告诉过我关于**是,我不得不看它在互联网上. (3认同)

小智 8

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