0

据此构造函数实际上是初始化器。并且根据这个new答案,在调用关键字之后的构造函数之前已经创建了对象。

所以我的问题是new如果我不想初始化任何东西,需要在关键字之后放置构造函数吗?

4

6 回答 6

5

像这样想...

  1. JVM 为对象分配内存,但尚未初始化或连接。
  2. JVM 为内存中的对象分配通用的东西,比如指向方法的指针、静态变量等。虽然对象存在,但它仍然不是通过执行构造函数唯一地初始化。
  3. 构造函数被调用,它初始化对象。
于 2012-07-23T16:37:02.167 回答
4

如果你不想初始化你的变量,你可以声明它:

MyObject myObject;

但是,如果您希望能够对 做任何事情myObject,您需要创建一个变量可以指向的对象,这可以通过new关键字来完成。否则myObject只是指着一个大的没有。

于 2012-07-23T16:35:33.970 回答
1

多年来,Java 上游语言中的术语侵入了 Java 语言。

过去 (C) 分配是与初始化分开的步骤。它们在 C++ 中结合,现在被认为是同一个东西。从技术上讲,“构造”中的操作顺序是

  1. 为对象分配的内存
  2. 按指定初始化该内存。

对于对象的父类,可以多次执行这些步骤。关键是分配总是在初始化之前,并且两者是紧密耦合的。分配必须先于初始化,否则初始化没有内存要初始化。构造函数保证两者都完成以避免其他语言中的早期问题,其中程序将通过访问已分配但未初始化的项目来访问随机数据。创建构造函数是为了防止此类错误。

现在,您分配给的东西是一个变量,并且变量包含对值的引用(在 Java 中,对于对象)。因此,您可以将变量简单地视为可以取消引用到值的名称。如果您想要一个新名称,但不想让它引用任何内容,那么 Keppil 的答案是最好的。

我的类型我的名字;

这将创建一个引用无值(null)的名称。

但是,在 Java 中,必须初始化对象值。没有“没有初始化的分配”,因为这相当于拥有一个具有随机内部状态的对象。随机内部状态意味着使用该对象(充其量)会产生随机结果,并且(最坏情况下)会引用不存在的对象。由于分配和初始化的构造紧密耦合,类型系统工作;没有它,理论上你可以引用一个不存在的对象,从而在 Java 中重新创建 C 的分段错误。

于 2012-07-23T16:45:58.080 回答
0

您要初始化对象本身,包括为对象分配内存。还有其他内务处理也需要完成。

于 2012-07-23T16:36:12.880 回答
0

引用您发布的链接:

构造函数的工作是确保新对象处于有效状态...

你真的想创建一个对象而不让它处于有效状态吗?

但是,如果您只想要一个对象引用,只需声明一个并且不要调用 new。

MyClass mc;
于 2012-07-23T16:36:17.127 回答
0

你是对的,Java语法可能是

String str = new

代替

String str = new String()

给你一个空字符串。问题是有时我们想像这样将参数传递给构造函数:

String str = new String("text")

这就是我们调用构造函数的原因。为了保持语法一致,您还必须调用默认构造函数String()。在这种情况下String是一个不可变类,因此没有其他方法可以设置它的初始值。

于 2012-07-23T16:39:52.743 回答