据此,构造函数实际上是初始化器。并且根据这个new
答案,在调用关键字之后的构造函数之前已经创建了对象。
所以我的问题是new
如果我不想初始化任何东西,需要在关键字之后放置构造函数吗?
像这样想...
如果你不想初始化你的变量,你可以声明它:
MyObject myObject;
但是,如果您希望能够对 做任何事情myObject
,您需要创建一个变量可以指向的对象,这可以通过new
关键字来完成。否则myObject
只是指着一个大的没有。
多年来,Java 上游语言中的术语侵入了 Java 语言。
过去 (C) 分配是与初始化分开的步骤。它们在 C++ 中结合,现在被认为是同一个东西。从技术上讲,“构造”中的操作顺序是
对于对象的父类,可以多次执行这些步骤。关键是分配总是在初始化之前,并且两者是紧密耦合的。分配必须先于初始化,否则初始化没有内存要初始化。构造函数保证两者都完成以避免其他语言中的早期问题,其中程序将通过访问已分配但未初始化的项目来访问随机数据。创建构造函数是为了防止此类错误。
现在,您分配给的东西是一个变量,并且变量包含对值的引用(在 Java 中,对于对象)。因此,您可以将变量简单地视为可以取消引用到值的名称。如果您想要一个新名称,但不想让它引用任何内容,那么 Keppil 的答案是最好的。
我的类型我的名字;
这将创建一个引用无值(null)的名称。
但是,在 Java 中,必须初始化对象值。没有“没有初始化的分配”,因为这相当于拥有一个具有随机内部状态的对象。随机内部状态意味着使用该对象(充其量)会产生随机结果,并且(最坏情况下)会引用不存在的对象。由于分配和初始化的构造紧密耦合,类型系统工作;没有它,理论上你可以引用一个不存在的对象,从而在 Java 中重新创建 C 的分段错误。
您要初始化对象本身,包括为对象分配内存。还有其他内务处理也需要完成。
引用您发布的链接:
构造函数的工作是确保新对象处于有效状态...
你真的想创建一个对象而不让它处于有效状态吗?
但是,如果您只想要一个对象引用,只需声明一个并且不要调用 new。
MyClass mc;
你是对的,Java语法可能是
String str = new
代替
String str = new String()
给你一个空字符串。问题是有时我们想像这样将参数传递给构造函数:
String str = new String("text")
这就是我们调用构造函数的原因。为了保持语法一致,您还必须调用默认构造函数String()
。在这种情况下String
是一个不可变类,因此没有其他方法可以设置它的初始值。