繁体   English   中英

为什么在对象创建时调用构造函数?

[英]Why constructors are called on the time of Object Creation?

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

所以我的问题是,如果我不想初始化任何东西,将构造函数放在new关键字之后的需求是什么。

这样想吧...

  1. JVM为对象分配内存,但是尚未初始化或连接。
  2. JVM为内存中的对象分配通用的东西,例如指向方法的指针,静态变量等。当对象存在时,仍然不能通过执行构造函数来唯一地初始化它。
  3. 调用构造函数,从而初始化对象。

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

MyObject myObject;

但是,如果您希望能够使用myObject进行任何操作,则需要创建一个变量可以指向的对象,并使用new关键字完成此操作。 否则, myObject只会指向大的空白。

多年以来,Java上游语言中的术语一直侵犯Java语言。

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

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

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

现在,您分配给它的东西是一个变量,变量保存对值的引用(在Java中,对于对象)。 因此,您可以仅将变量视为可以取消引用值的名称。 如果您想要一个新名称,但又不想引用任何名称,那么Keppil的答案是最好的。

MyType myName;

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

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

您想初始化对象本身,包括为对象分配内存。 还有其他内部管理工作也需要完成。

引用您发布的链接:

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

您是否真的要创建一个对象而不使其处于有效状态?

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

MyClass mc;

没错,Java语法可能是

String str = new

代替

String str = new String()

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

String str = new String("text")

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM